SciPy是一种免费开源Python库,用于科学计算和技术计算。它包含用于优化、线性代数、积分、插值、特殊函数、FFT、信号及图像处理、ODE求解器以及科学工程中其他常见任务的模块。
现在,组合使用NumPy、SciPy和Matplotlib,作为MATLAB的替代品已经成为趋势。相比MATLAB,Python功能更强大、编程更容易。
SciPy 模块
根据针对的计算领域,SciPy被分成各个不同的模块。下表对这些模块进行了总结:
序号 | 模块 | 描述 |
1 | scipy.cluster | Vector quantization / Kmeans |
2 | scipy.constants | 物理和数学常数 |
3 | scipy.fftpack | 傅里叶变换 |
4 | scipy.integrate | 积分 |
5 | scipy.interpolate | 差值 |
6 | scipy.io | 文件 |
7 | scipy.linalg | 线性代数 |
8 | scipy.ndimage | 多维图像处理 |
9 | scipy.odr | Orthogonal(正交) distance regression |
10 | scipy.optimize | 优化 |
11 | scipy.signal | 信号处理 |
12 | scipy.sparse | 稀疏矩阵 |
13 | scipy.spatial | Spatial data structures and algorithms |
14 | scipy.special | 特殊函数 |
15 | scipy.stats | 统计 |
SciPy-数值计算库-数学常量,物理常量,单位信息
import scipyprint('scipy版本:',scipy.__version__)from scipy import constants as C#数学常量Mathematical constantsprint('Pi:',C.pi)print('Golden ratio:',C.golden)#物理常数Physical constantsprint ('真空中光速:',C.c) # 真空中的光速print ('普朗克常数:',C.h) # 普朗克常数print('Bohr radius:',C.physical_constants["Bohr radius"]) #数值、单位及误差。
# 单位信息 print('mile: ',C.mile) #1英里等于多少米print('inch:',C.inch) #1英寸等于多少米print('gram:',C.gram) #1克等于多少千克print('pound:', C.pound) #1磅等于多少千克
scipy.special特殊函数模块
special模块是一个非常完整的函数库,其中包含了基本数学函数、特殊数学函数以及NumPy中出现的所有函数。
常用特殊函数求值:
伽玛函数
gamma函数是阶乘函数在实数和复数范围上的扩展。
import scipy.special as Sprint('伽马:',S.gamma(0.5))print(S.gamma(1+1j)) # gamma 函数支持复数
对数伽玛函数
gamma函数的增长速度非常快,因为1000的阶乘 已经超过了双精度浮点数的表示范围,因此结果是无穷大。为了计算更大的范围,可以使用 S.gammaln()。
S.gammaln(x)计算ln(|gamma(x)|)的值,它使用特殊的算法,直接计算gamma函数的对数值,因此可以表示更大的范围。
print(S.gammaln(1000))
log1p(x)
special模块中的某些函数并不是数学意义上的特殊函数,例如log1p(x)计算log(1+x)的值。这是由于浮点数的精度有限,无法很精确地表示十分接近1的实数。例如无法用浮点数表示”1 + 1e-20”的值,因此“log(1+1e-20)”的值为0,而当使用log1p()时,则可以很精确地计算。实际上当x非常小时,log1p(x)约等于x 。
print (1 + 1e-20)print ('log(1+1e-20: ',np.log(1+1e-20))print ('loglp:',S.log1p(1e-20))
在scipy.special中使用scipy.special.ellipj()函数计算椭圆函数。
m = np.linspace(0.1, 0.9, 4)u = np.linspace(-10, 10, 200)results = S.ellipj(u[:, None], m[None, :])print([y.shape for y in results])
import numpy as npimport pylab as pl#%figonly=使用广播计算得到的`ellipj()`返回值fig, axes = pl.subplots(2, 2, figsize=(12, 4))labels = ["$sn$", "$cn$", "$dn$", "$\phi$"]for ax, y, label in zip(axes.ravel(), results, labels): ax.plot(u, y) ax.set_ylabel(label) ax.margins(0, 0.1) axes[1, 1].legend(["$m={:g}$".format(m_) for m_ in m], loc="best", ncol=2);
一步一步耐心学