65.9K
CodeProject 正在变化。 阅读更多。
Home

开始使用 SciPy (Scientific Python) 库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (4投票s)

2009年7月23日

BSD

7分钟阅读

viewsIcon

80268

如何开始使用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创建绘图。

© . All rights reserved.