Python SciPy:科学计算库与函数综合教程
Python SciPy:科学计算库与函数综合教程
Python 中的 SciPy
SciPy 是开源库,在 NumPy 基础上提供解决数学、科学、工程和技术问题的工具。SciPy 构建于 NumPy 之上,为数据操作和可视化提供广泛的高级命令。
子包
- scipy.io – MATLAB、NetCDF、CSV 等格式的文件 I/O
- scipy.special – 特殊数学函数(贝塞尔、伽马等)
- scipy.linalg – 线性代数例程
- scipy.interpolate – 插值技术
- scipy.optimize – 优化与曲线拟合
- scipy.stats – 统计分布与随机数生成
- scipy.integrate – 数值积分
- scipy.fftpack – 快速傅里叶变换
- scipy.signal – 信号处理
- scipy.ndimage – 多维图像处理
本教程涵盖:
- SciPy 是什么及其重要性
- NumPy 与 SciPy 的区别
- 安装与环境配置
- 关键子包代码示例
- 实际应用:线性代数、傅里叶变换、优化、图像处理、数值积分
为什么使用 SciPy?
- 全面的科学工具集,仅次于 GNU Scientific Library 和 MATLAB
- 易用、快速、完全兼容 NumPy 数组
- 学术界和工业界广泛采用,确保强大支持和社区贡献
NumPy vs SciPy
NumPy
- Python 高性能数值计算核心库,用 C 编写
- 提供数组对象和基本操作(排序、重塑、索引)
- 所有 Python 科学库的基础
SciPy
- 构建于 NumPy 之上,用专用算法扩展
- 包含完整线性代数套件、优化、统计等
- 高级科学工作流必备
安装与环境配置
用 pip 或系统包管理器安装 SciPy:
Python3 -m pip install --user numpy scipy
sudo apt-get install python-scipy python-numpy
sudo port install py35-scipy py35-numpy
脚本中导入 SciPy 和 NumPy:
from scipy import special import numpy as np
文件 I/O – scipy.io
轻松保存和加载 MATLAB .mat 文件:
import numpy as np
from scipy import io as sio
array = np.ones((4, 4))
sio.savemat('example.mat', {'ar': array})
loaded = sio.loadmat('example.mat', struct_as_record=True)
print(loaded['ar'])
输出:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
特殊函数 – scipy.special
常用特殊函数示例:
- 立方根:
scipy.special.cbrt(x)→cbrt([27, 64]) # [3., 4.] - 10x:
scipy.special.exp10(x)→exp10([1,10]) # [1.e+01 1.e+10] - 组合数:
scipy.special.comb(N, k, exact=False, repetition=True)→comb(5, 2) # 15.0 - 排列数:
scipy.special.perm(N, k, exact=True)→perm(5, 2) # 20 - LogSumExp:
scipy.special.logsumexp(x) - 贝塞尔 J:
scipy.special.jn(n, x)
线性代数 – scipy.linalg
计算行列式、逆、特征值和特征向量:
from scipy import linalg import numpy as np A = np.array([[4,5],[3,2]]) print(linalg.det(A)) # -7.0 print(linalg.inv(A)) # 逆矩阵 vals, vecs = linalg.eig(A) print(vals) print(vecs)
输出:
-7.0
array([[-0.28571429, 0.71428571],
[ 0.42857143, -0.57142857]])
[ 9.+0.j -1.+0.j]
[[ 0.70710678 -0.5547002 ]
[ 0.70710678 0.83205029]]
离散傅里叶变换 – scipy.fftpack
变换正弦波并可视化频谱:
%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
from scipy import fftpack
freq = 5
sample_rate = 50
t = np.linspace(0, 2, 2 * sample_rate, endpoint=False)
wave = np.sin(freq * 2 * np.pi * t)
plt.plot(t, wave)
plt.xlabel('Time (s)'); plt.ylabel('Amplitude')
plt.show()
A = fftpack.fft(wave)
frequency = fftpack.fftfreq(len(wave)) * sample_rate
plt.stem(frequency, np.abs(A))
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.xlim(-sample_rate/2, sample_rate/2)
plt.ylim(0, 110)
plt.show()
优化 – scipy.optimize
用 BFGS 寻找标量函数最小值,用盆地跳跃全局搜索:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
def func(a):
return a*2 + 20*np.sin(a)
plt.plot(np.linspace(-10, 10, 400), func(np.linspace(-10, 10, 400)))
plt.show()
min_bfgs = optimize.fmin_bfgs(func, 0)
print('BFGS result:', min_bfgs)
min_basin = optimize.basinhopping(func, 0)
print('Basin-hopping result:', min_basin.x)
输出显示 BFGS 找到的局部最小值和盆地跳跃确认的全局最优。
Nelder-Mead 算法
无梯度信息的简单无约束最小化:
from scipy.optimize import minimize
def f(x):
return 0.4*(1 - x[0])**2
res = minimize(f, [2, -1], method='Nelder-Mead')
print('Result:', res.x, 'Function value:', res.fun)
图像处理 – scipy.ndimage
操作图像:显示、翻转、旋转、应用滤波器。
from scipy import ndimage, misc
from matplotlib import pyplot as plt
panda = misc.face()
plt.imshow(panda)
plt.title('Original')
plt.show()
flip_down = np.flipud(panda)
plt.imshow(flip_down)
plt.title('Flip Down')
plt.show()
rotated = ndimage.rotate(panda, 135)
plt.imshow(rotated)
plt.title('Rotated 135°')
plt.show()
数值积分 – scipy.integrate
单重和二重积分带自动误差估计:
from scipy import integrate
# 0 到 1 的 x^2 单重积分
single = integrate.quad(lambda x: x**2, 0, 1)
print('Single integral:', single)
# 三角域上 64*x*y 二重积分
double = integrate.dblquad(lambda x, y: 64*x*y, 0, 2/4,
lambda x: 0, lambda y: (1 - 2*y**2)**0.5)
print('Double integral:', double)
均返回元组:(值, 估计误差)。
总结
SciPy 扩展 NumPy 提供完整科学计算栈,含线性代数、优化、统计、信号处理、图像操作。其丰富子包和强大社区支持使其成为研究者和工程师不可或缺的工具。
| 包名 | 描述 |
|---|---|
| scipy.io | MATLAB、CSV、NetCDF 等文件输入输出 |
| scipy.special | 特殊数学函数(贝塞尔、伽马等) |
| scipy.linalg | 高级线性代数例程 |
| scipy.interpolate | 插值方法 |
| scipy.optimize | 优化与曲线拟合工具 |
| scipy.stats | 统计分布与随机数生成 |
| scipy.integrate | 数值积分(quad、dblquad 等) |
| scipy.fftpack | 快速傅里叶变换 |
| scipy.signal | 信号处理工具 |
| scipy.ndimage | 多维图像处理 |
Python
- 精通C标准库函数:实战指南
- Python print() 函数完全指南:基础用法、空行打印与自定义结束符
- Python str.count() 完全指南:统计字符与子串出现次数实战
- Python format() 字符串格式化完全指南:占位符、格式化规范、类与字典应用
- Python 字符串 find() 方法完全指南:语法、参数、替代方案与计数技巧
- 精通 Python Lambda 函数:实用示例与最佳实践
- Python abs() 函数:计算数字与复数的绝对值
- Python round() 函数详解与实战示例
- 精通 Python map() 函数:语法、示例与最佳实践
- Python timeit():精准测量代码执行时间与实战示例
- 精通 Python yield:生成器 vs return 实战指南
- 理解 Python type() 与 isinstance():实战示例详解