
2.3 SciPy科学计算库
SciPy库在NumPy库的基础上增加了众多的数学、科学及工程计算中常用的库函数。
2.3.1 初识SciPy
SciPy库依赖NumPy库,提供了便捷且快速的n维数组操作。SciPy库与NumPy数组一起工作,并提供了许多友好和高效的处理方法。例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵、常微分方差的求解等,功能十分强大。
由于SciPy也是Python的第三方库,需要另外安装:

安装完成后,我们来查看SciPy版本,代码如下:

SciPy被组织覆盖成不同科学计算领域的子包,其模块功能如表2-6所示。
表2-6 SciPy模块功能

2.3.2 SciPy经典应用
SciPy功能强大,下面举例说明SciPy在各领域的应用,以便学习。
1. 积分
积分学不仅推动了数学的发展,而且也极大地推动了天文学、力学、物理学、化学、生物学、工程学、经济学等自然科学,以及社会科学及应用科学各个分支的发展,并在这些学科中有越来越广泛的应用。特别是计算机的出现,更有助于这些应用的不断发展。scipy.integration提供了多种积分模块,主要分为以下两类:一种是对给定的函数对象积分,如表2-7所示;另一种是对给定固定样本的函数积分。我们一般关注对数值积分的trapz函数和cumtrapz函数。trapz()使用复合梯形规则沿给定轴线进行积分,cumtrapz()使用复合梯形法则累计积分。
表2-7 积分函数(给定的函数对象)

下面通过例子演示利用SciPy求解积分问题。
【例2-14】 利用quad()计算定积分。

运行程序,输出如下:

四元函数返回两个值,其中第一个数值是积分值,第二个数值是积分值绝对误差的估计值。
注意:由于quad()需要函数作为第一个参数,因此不能直接将exp作为参数传递。quad函数接受正和负无穷作为限制。
【例2-15】 求解双重积分。
解析:使用lambda表达式定义函数f,g和h。请注意,即使g和h是常数,它们可能在很多情况下必须定义为函数。

运行程序,输出如下:

2. 插值
插值是在直线或曲线上的两点之间找到值的过程。这种插值工具不仅适用于统计学,而且在科学、商业或需要预测两个现有数据点内的值时也很有用。
在SciPy中可通过interp1d()来完成数据的插值,其语法格式为:

用x和y来逼近指定函数f:y=f(x)。interp1d()返回一个函数,调用该方法可使用插值来查找新点的值。
函数的参数含义如下。
• x:一维数组;
• y:插值函数中x对应值;
• kind:插值的类型,包含“linear”“nearest”“zero”“slinear”“quadratic”“cubic”“previous”“next”等。
【例2-16】 实现数据的插值。

运行程序,效果如图2-6所示。

图2-6 插值效果
3. 峰度
峰度(Kurtosis)是指次数分布曲线顶峰的尖平程度,是次数分布的重要特征。在统计分析上,常以正态分布曲线为标准,观察比较某一次数分布曲线的顶端或平顶及尖平程度的大小。
峰度的测定,一般是采用统计动差方法,即以4阶中心动差V4为测定依据,将V4除以其标准差的4次方σ4,以消除单位量纲的影响,便于不同次数分布曲线的峰度比较,从而得到以无名数表示的相对数,即峰度的测定值(β)。计算公式为

在SciPy中,通过stats.kurtosis()计算峰度。
【例2-17】 计算一随机数的峰度。


运行程序,输出如下,效果如图2-7所示。


图2-7 柱状图表示峰度效果
4. 最小二乘拟合
假设有一组实验数据,它们之间的函数关系为
,通过这些已知信息,需要确定函数中的一些参数项。例如,如果f是一个线性函数
,那么参数k和b就是我们需要确定的值。如果将这些参数用p表示,那么我们要找到一组p值,使得如下公式中的S函数最小:

这种算法被称为最小二乘拟合(Least-square Fitting)。
在SciPy中的子函数库optimize已经提供了实现最小二乘拟合算法的函数leastsq。
【例2-18】 SciPy实现最小二乘拟合。

运行程序,输出如下,效果如图2-8所示。


图2-8 最小二乘拟合效果
由结果可以看出,由于正弦函数的周期性,拟合参数规律走势和真实数据实际上是一致的。
5. 图像处理
图像识别是计算机对图像进行处理、分析和理解的过程,以识别各种不同模式的目标和对象。识别过程包括图像预处理、图像分割、特征提取和判断匹配。简单地说,图像识别就是要让计算机像人一样读懂图片的内容。借助图像识别技术,我们不仅可以通过图像搜索更快地获取信息,还可以产生一种新的与外部世界交互的方式,甚至会让外部世界更加智能地运行。
SciPy可实现对图像的基本操作,如裁剪、翻转、旋转、图像滤镜等,使用整个NumPy把图像处理成数组,如图2-9所示。

图2-9 图像处理成数组
【例2-19】 利用SciPy实现图像处理。


运行程序,图像处理效果如图2-10所示。

图2-10 图像处理效果