Scipy:高端科学计算
作者:Adrien Chauve, Andre Espaze, Emmanuelle Gouillart, Ga?l Varoquaux, Ralf Gommers
译者表示最后部分没怎么看懂,此文档维护中……Scipy
scipy包包含致力于科学计算中常见问题的各个工具箱。它的不同子模块相应于不同的应用。像插值,积分,优化,图像处理,,特殊函数等等。
scipy可以与其它标准科学计算程序库进行比较,比如GSL(GNU C或C++科学计算库),或者Matlab工具箱。scipy是Python中科学计算程序的核心包;它用于有效地计算numpy矩阵,来让numpy和scipy协同工作。
在实现一个程序之前,值得检查下所需的数据处理方式是否已经在scipy中存在了。作为非专业程序员,科学家总是喜欢重新发明造轮子,导致了充满漏洞的,未经优化的,很难分享和维护的代码。相反,Scipy程序经过优化和测试,因此应该尽可能使用。
目录
- 文件输入/输出:scipy.io
- 特殊函数:scipy.special
- 线性代数运算:scipy.linalg
- 快速傅里叶变换:scipy.fftpack
- 优化和拟合:scipy.optimize
- 统计和随机数: scipy.stats
- 插值:scipy.interpolate
- 数值积分:scipy.integrateFusy,
- 信号处理:scipy.signal
- 图像处理:scipy.ndimage
- 总结练习
- Footnotes
警告:这个教程离真正的数值计算介绍很远。因为枚举scipy中不同的子模块和函数非常无聊,我们集中精力代之以几个例子来给出如何使用`scipy`进行计算的大致思想。
scipy 由一些特定功能的子模块组成:
模块 | 功能 |
---|---|
scipy.cluster | 矢量量化 / K-均值 |
scipy.constants | 物理和数学常数 |
scipy.fftpack | 傅里叶变换 |
scipy.integrate | 积分程序 |
scipy.interpolate | 插值 |
scipy.io | 数据输入输出 |
scipy.linalg | 线性代数程序 |
scipy.ndimage | n维图像包 |
scipy.odr | 正交距离回归 |
scipy.optimize | 优化 |
scipy.signal | 信号处理 |
scipy.sparse | 稀疏矩阵 |
scipy.spatial | 空间数据结构和算法 |
scipy.special | 任何特殊数学函数 |
scipy.stats | 统计 |
它们全依赖numpy,但是每个之间基本独立。导入Numpy和这些scipy模块的标准方式是:
import numpy as np from scipy import stats # 其它子模块相同
主scipy命名空间大多包含真正的numpy函数(尝试 scipy.cos 就是 np.cos)。这些仅仅是由于历史原因,通常没有理由在你的代码中使用import scipy
文件输入/输出:scipy.io
-
导入和保存matlab文件:
In [1]: from scipy import io as spio In [3]: import numpy as np In [4]: a = np.ones((3, 3)) In [5]: spio.savemat('file.mat', {'a': a}) # savemat expects a dictionary /usr/lib/python2.7/site-packages/scipy/io/matlab/mio.py:266: FutureWarning: Using oned_as default value ('column') This will change to 'row' in future versions oned_as=oned_as) In [6]: data = spio.loadmat('file.mat', struct_as_record=True) In [7]: data['a'] Out[7]: array([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])
-
读取图片:
In [16]: from scipy import misc In [17]: misc.imread('scikit.png') Out[17]: array([[[255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], ..., [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]], [[255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], ..., [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]], [[255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], ..., [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]], ..., [[255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], ..., [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]], [[255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], ..., [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]], [[255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], ..., [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]]], dtype=uint8) In [18]: import matplotlib.pyplot as plt In [19]: plt.imread('scikit.png') Out[19]: array([[[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], ..., [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]], [[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], ..., [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]], [[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], ..., [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]], ..., [[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], ..., [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]], [[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], ..., [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]], [[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], ..., [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]]], dtype=float32)
参见:
- 载入txt文件:numpy.loadtxt()/numpy.savetxt()
- 智能导入文本/csv文件:numpy.genfromtxt()/numpy.recfromcsv()
- 高速,有效率但numpy特有的二进制格式:numpy.save()/numpy.load()
特殊函数:scipy.special
特殊函数是先验函数。scipy.special的文档字符串写得非常好,所以我们不在这里列出所有函数。常用的有:
- 贝塞尔函数,如scipy.special.jn()(整数n阶贝塞尔函数)
- 椭圆函数(scipy.special.ellipj()雅可比椭圆函数,……)
- 伽马函数:scipy.special.gamma(),还要注意scipy.special.gammaln,这个函数给出对数坐标的伽马函数,因此有更高的数值精度。
线性代数运算:scipy.linalg
scipy.linalg模块提供标准线性代数运算,依赖于底层有效率的实现(BLAS,LAPACK)。
-
scipy.linalg.det()函数计算方阵的行列式:
In [22]: from scipy import linalg In [23]: arr = np.array([[1, 2], ....: [3, 4]]) In [24]: linalg.det(arr) Out[24]: -2.0 In [25]: linalg.det(np.ones((3,4))) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) in () ----> 1 linalg.det(np.ones((3,4))) /usr/lib/python2.7/site-packages/scipy/linalg/basic.pyc in det(a, overwrite_a) 398 a1 = np.asarray_chkfinite(a) 399 if len(a1.shape) != 2 or a1.shape[0] != a1.shape[1]: --> 400 raise ValueError('expected square matrix') 401 overwrite_a = overwrite_a or _datacopied(a1, a) 402 fdet, = get_flinalg_funcs(('det',), (a1,)) ValueError: expected square matrix