开始使用 SciPy (Scientific Python) 库






4.67/5 (4投票s)
如何开始使用SciPy库进行Python科学计算。
引言
SciPy 是一个庞大的Python科学计算库。本文将介绍如何开始使用SciPy,概述该库提供的功能,并提供一些常见任务的使用示例。
SciPy入门
SciPy的下载页面提供了SciPy和NumPy的SourceForge下载链接。(SciPy依赖于NumPy,因此必须同时安装这两个包才能使用SciPy。)SciPy(以及NumPy)的版本必须与你的Python版本兼容。在撰写本文时,SciPy支持Python 2.6及更早版本。特别是,Python 3.0尚不支持。
IronPython无法直接使用SciPy,因为SciPy的许多部分是用C实现的,而目前IronPython只能直接导入用Python实现的模块。但是,Ironclad包使IronPython能够使用SciPy。有关详细信息,请参阅Ironclad在IronPython中的数值计算。
要开始使用SciPy,请导入scipy
包。按照惯例,scipy
包通常会缩写为sp
以方便使用。
>>> import scipy as sp
scipy
层次结构的根目录有一些功能,但大多数功能位于必须单独导入的子包中。例如,erf
函数位于特殊函数子包special
中。要调用erf
函数,您需要先导入special
子包。
>>> from scipy import special
>>> special.erf(2.0)
0.99532226501895271
获取帮助
SciPy文档页面提供了HTML、PDF和CHM(HTML帮助)格式的详尽文档链接。
与任何Python包一样,您也可以在命令行中使用Python的help()
函数查找SciPy对象。然而,有时help
在处理SciPy时可能效果不佳。scipy.info()
函数类似于标准的help()
函数,但经过优化,可以为SciPy对象提供更好的文档。当scipy.info()
接收字符串参数时,它会搜索匹配的对象。当scipy.info()
接收对象作为参数时,它会返回该对象的特定文档。例如,如果scipy
已导入为sp
,则
>>> sp.info("gamma")
将返回关于伽马概率分布和伽马函数两者的文档。但是,
>>> sp.info(special.gamma)
将仅返回伽马函数的文档。
库概述
下表列出了scipy
的子包及其简要描述。下一节将提供使用一些更常见子包的示例。
子包 | 描述 |
cluster |
聚类算法 |
constants |
数学和物理常数 |
fftpack |
傅里叶变换 |
integrate |
数值积分 |
interpolate |
插值 |
io |
输入和输出 |
linalg |
线性代数 |
maxentropy |
最大熵模型 |
misc |
杂项 |
ndimage |
多维图像处理 |
odr |
正交距离回归 |
optimize |
优化 |
signal |
信号处理 |
sparse |
稀疏矩阵 |
spatial |
空间算法和数据结构 |
special |
特殊函数 |
stats |
统计函数 |
stsci |
图像处理 |
weave |
C/C++集成 |
示例
SciPy非常庞大。草拟的SciPy参考指南目前有632页。本文仅演示SciPy功能的一小部分,重点关注一些更常见的应用。
特殊函数
special
子包包含Python标准math
包中不包含的数学函数。最常用的特殊函数可能是伽马函数Γ(x)。下面的示例演示了如何从SciPy访问它。
>>> from scipy.special import gamma
>>> gamma(0.5)
1.7724538509055159
SciPy包含十几个与伽马函数相关的函数。例如,有一个单独的函数gammaln
专门用于返回伽马函数的对数。这似乎有些多余,但非常实用。由于伽马函数增长非常快,很容易溢出,因此伽马函数的对数通常比伽马函数本身更有用。SciPy中其他一些与伽马相关的函数包括不完全伽马函数gammainc
、beta函数beta
以及伽马函数的对数导数psi
。伽马函数绝不是SciPy中唯一包含的特殊函数。所有最常用的特殊函数都包含在内:贝塞尔函数、菲涅尔积分等。
special
中的一些函数在数学意义上不会被归类为“特殊”。这些是初等函数,之所以包含它们,是因为它们在数值计算中存在困难。例如,scipy.special
包含一个名为log1p
的函数,用于计算log(1 + x)。乍一看,这个函数似乎毫无用处:为什么不直接使用math.log(1 + x)
而不是log1p
呢?问题在于,在实际应用中,您经常需要计算小值x的log(1 + x)。如果x足够小(例如,小于10-16),那么math.log(1 + x)
将返回0,因为在机器精度下1 + x将等于x,而math.log(1 + x)
将简单地返回log(1)即0。log1p
函数通过间接计算log(1 + x)而不是直接计算1 + x来避免这个问题。
常量
constants
子包包含各种物理常数。以下代码将显示一些常见常数
>>> from scipy import constants
>>> constants.c # speed of light
299792458.0
>>> constants.h # Plank’s constant
6.6260693000000002e-034
>>> constants.N_A # Avogadro’s number
6.0221415000000003e+023
字典physical_constants
的键是描述性字符串。值是包含常数的值、其单位以及值的不确定度的三元组。例如,该字典提供了电子质量的信息。
>>> constants.physical_constants["electron mass"]
(9.1093825999999998e-031, ‘kg’, 1.5999999999999999e-037)
除了物理常数之外,constants
还包含单位信息。例如,constants.nautical_mile
等于1852,即一海里的米数。而且,如果您曾经好奇过,constants.troy_ounce
等于0.0311034768,即一金衡盎司的千克数。它还支持SI和二进制单位前缀。例如,SI前缀constants.kilo
等于103 = 1000.0,二进制前缀constants.kibi
= 210 = 1024。
集成
integrate
子包包含多个数值积分例程。最常用的例程是quad
(名称来源于“quadrature”,一个过时的积分名称)。quad
的第一个参数是要积分的单变量函数。对于简单函数,方便使用lambda
内联定义函数,当然也可以使用def
在其他地方定义被积函数。quad
函数返回一个对:积分值和该值估计的误差。以下代码在2到3的区间内积分cos(ex)。
>>> from scipy import integrate
>>> integrate.quad(lambda x: math.cos(math.exp(x)), 2, 3)
(-0.063708480528704675, 2.4175070627010321e-014)
要在quad
中指定无限积分限,请使用常量scipy.inf
表示∞,如下例所示
>>> from scipy import inf
integrate.quad(lambda x: math.exp(-x*x), -inf, inf)
(1.7724538509055159, 1.4202636780944923e-008)
integrate
子包包含其他积分例程,例如用于二重积分的dblquad
和用于三重积分的tplquad
。它还包含用于数值求解常微分方程组的odeint
。
概率与统计
stats
子包包含大量的概率和统计函数。该库目前提供81种连续分布和12种离散分布。下面的示例展示了如何计算均值为0、标准差为3的正态(高斯)随机变量取值小于5的概率。它还展示了如何从同一分布中生成五个随机样本。
>>> from scipy.stats import norm
>>> norm.cdf(5, 0, 3)
0.9522096477271853
>>> norm.rvs(0, 3, size=5)
array([ 4.85229537, 3.0104119 , 1.13189841, 5.19688369, -2.97970912])
有关处理概率分布的更多示例,请参阅SciPy中的概率分布。
stats
子包具有简单的函数,例如用于计算数字数组样本标准差的std
。它还拥有更复杂的函数,例如用于处理线性回归、方差分析等的glm
。它还包含用于许多统计测试和常见任务(如生成直方图)的函数。
请注意,某些统计功能位于stats
子包之外。例如,正交距离回归支持包含在其自己的子包odr
中。此外,您可能需要将linalg
子包与stats
结合使用。
更多资源
SciPy.org网站提供了指向更多文档的链接,包括教程和cookbook示例。
Mathesaurus是一个用于比较SciPy、Matlab、R等数学环境的“罗塞塔石碑”。该网站上的资源很有用,即使您不熟悉其他包,只想快速查找如何在Python(尤其是SciPy)中执行各种任务。
IPython shell是与SciPy进行交互式工作的流行环境。此外,许多SciPy用户使用matplotlib从标准Python命令行或IPython创建绘图。