Scipy:高端科学计算

本文详细介绍了Python的Scipy库在科学计算中的应用,包括文件输入/输出、特殊函数、线性代数、快速傅里叶变换、优化和拟合、统计和随机数、插值、数值积分、信号处理以及图像处理等多个方面,提供了丰富的示例和代码,展示了Scipy在数据分析和处理中的强大功能。
摘要由CSDN通过智能技术生成

Scipy:高端科学计算

作者:Adrien Chauve, Andre Espaze, Emmanuelle Gouillart, Ga?l Varoquaux, Ralf Gommers

翻译自:scipy lecture notes

译者表示最后部分没怎么看懂,此文档维护中……

Scipy

scipy包包含致力于科学计算中常见问题的各个工具箱。它的不同子模块相应于不同的应用。像插值,积分,优化,图像处理,,特殊函数等等。

scipy可以与其它标准科学计算程序库进行比较,比如GSL(GNU C或C++科学计算库),或者Matlab工具箱。scipy是Python中科学计算程序的核心包;它用于有效地计算numpy矩阵,来让numpy和scipy协同工作。

在实现一个程序之前,值得检查下所需的数据处理方式是否已经在scipy中存在了。作为非专业程序员,科学家总是喜欢重新发明造轮子,导致了充满漏洞的,未经优化的,很难分享和维护的代码。相反,Scipy程序经过优化和测试,因此应该尽可能使用。


目录


警告:这个教程离真正的数值计算介绍很远。因为枚举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 
        
        
       
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值