每一个时代,都不缺少英雄。真正的英雄,通常都会默默无闻地隐于市井,而当危难来临的时刻,他们总会在正确的时刻出现在正确的位置上。SciPy就是一位这样的英雄,他几乎无所不能,却鲜为人知。SciPy基于NumPy提供的数据结构之上,构建了大量的数学算法和工程函数,涵盖了数学分析、线性代数、空间向量、形态学、图像处理、信号分析、机器学习等几乎所有你能想象到的学科领域。受益于Python无数的模块和Matplotlib绘图库的辅助,SciPy在功能上已经足以与MATLAB、IDL、Octave、R-Lab和SciLab等系统相媲美,而在使用上远比上述这些系统更加灵活。
1. SciPy概览SciPy是一个基于Python的用于数学、科学和工程的开源软件生态系统,而SciPy模块则是这个生态系统的核心包之一。SciPy库依赖于NumPy,提供了便捷且快速的多维数组操作,以及许多易用和高效的算法,如数值积分、插值、优化、线性代数和统计等。
2. SciPy的组成SciPy的核心功能被封装在17个子模块中,子模块命名空间中的所有函数都是公有的。这意味着在后续的升级版本中,子模块中的所有函数不太可能以不兼容的方式重命名或更改,如果有必要,在进行更改之前,将对一个SciPy版本发出弃用警告。
- scipy.cluster:聚类算法子模块。
- scipy.constants:物理和数学常数子模块。
- scipy.fft:离散傅里叶变换子模块。
- scipy.fftpack:传统离散傅里叶变换子模块(即将被弃用)。
- scipy.integrate:积分子模块。
- scipy.interpolate:插值子模块。
- scipy.io:输入输出子模块。
- scipy.linalg:线性代数子模块。
- scipy.misc:例程子模块。
- scipy.ndimage:多维图像处理子模块。
- scipy.odr:正交距离回归子模块。
- scipy.optimize:优化与求根子模块。
- scipy.signal:信号处理子模块。
- scipy.sparse:稀疏矩阵子模块。
- scipy.spatial:空间算法和数据结构子模块。
- scipy.special:特殊函数子模块。
- scipy.stats:统计函数子模块
大多数情况下,使用pip命令就可以将SciPy安装在本地电脑上。如果你的Python环境还没有安装NumPy和Matplotlib等模块,建议一并安装它们。
PS C:\Users\xufive> python -m pip install numpy scipy matplotlib
SciPy模块命名空间下面,几乎包含了NumPy模块命名空间中的所有函数,比如,SciPy同样提供NumPy模块中的pi常数和余弦函数。
>>> import scipy as sp
>>> sp.cos(sp.pi)
Warning (from warnings module):
File "__main__", line 1
DeprecationWarning: scipy.cos is deprecated and will be removed in SciPy 2.0.0, use numpy.cos instead
-1.0
SciPy模块提供的NumPy模块中的常数和函数,虽然可用,但会显示警告信息,提醒从2.0版本之后将弃用。这些功能的重复,显示了SciPy家族发展中的分分合合。基于SciPy家族模块分工的原因,当我们使用这些函数时,应该从NumPy模块而非SciPy模块导入。
当我们需要调用SciPy的子模块函数时,应该导入子模块或者从子模块名称空间导入函数。例如,当我们计算定积分时,可以导入积分子模块integrate,然后调用integrate.quad(),也可以从积分子模块integrate导入定积分函数quad()。下面这两种方式都是可行的。
>>> from scipy import integrate
>>> from scipy.integrate import quad