
2.2 SciPy
SciPy是一个Python的常用科学计算工具包,本节主要介绍SciPy的安装和特点以及SciPy Linalg、SciPy文件操作、SciPy插值、SciPy Ndimage和SciPy算法优化等常用的内置模块(源代码见:Chapter2/ScipyDome.py)。
2.2.1 SciPy的安装和特点
SciPy官网(网址:https://www.scipy.org/)如图2-3所示,包含最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解等模块。

图2-3 SciPy官网
1. SciPy的安装
可使用以下3种方法安装SciPy:
方法一 Anaconda已经集成了SciPy,读者可使用命令conda list在DOS环境下查看。
方法二 可以通过pip命令自动安装,请执行如下命令:pip install scipy。
方法三 在GitHub上下载SciPy源码(网址:https://github.com/numpy/numpy),然后在源码根目录下执行如下命令:python setup.py install。
安装完成后,检测是否成功。首先打开Sublime,然后按F6键进入Python环境,最后输入import sicpy,得到如图2-4所示的状态即表示安装成功。

图2-4 验证SciPy是否成功安装
2. SciPy的特点
SciPy库依赖于NumPy,它提供了便捷且快速的N维数组操作。SciPy库与NumPy数组一起工作,并提供了许多用户友好和高效的实现方法,它们一起运行在所有流行的操作系统上,安装快速且免费。
SciPy提供了丰富的子模块,具体参见表2-5所示。
表2-5 SciPy的子模块

2.2.2 SciPy Linalg
SciPy Linalg模块包含线性代数函数,使用该模块可以计算逆矩阵、求特征值、解线性方程组以及求行列式等。
1. 求解线性方程组
我们使用Linalg求解如下方程组:

完整的代码实现如下:

代码说明:
数组a表示未知数的系数矩阵,数组b表示等号右边方程组值的矩阵。
运行结果:
线性方程组的解是: [ 2. -2. 8.]
2. 求解行列式

运行结果:
行列式的解是:14-23=-2.0
3. 求解特征值和特征向量

代码说明:
- A表示方阵。
- 特征值λ和相应的特征向量v的关系是:Av=λv。
运行结果:
特征值:[-0.37228132+0.j 5.37228132+0.j] 特征向量:[[-0.82456484 -0.41597356] [ 0.56576746 -0.90937671]]
4. 奇异值分解(SVD)

代码说明:
- 矩阵a分解为两个酉矩阵(U和Vh)和一个奇异值。
- a=U*s*Vh。
运行结果:

2.2.3 SciPy文件操作
1. 保存MATLAB文件

运行结果:

2. 查看MATLAB文件变量

运行结果:
[('vect', (1, 10), 'int32')]
2.2.4 SciPy插值
插值是在直线或曲线上的两点之间找到值的过程。插值不仅适用于统计学,而且在科学、商业和需要预测两个现有数据点之间的值时也很有用。
1. 绘制二维空间图

二维空间的余弦散列点运行结果如图2-5所示。

图2-5 绘制二维空间图
2. 一维插值
一种基于固定数据点来推导出函数的便捷方法,可以使用线性插值在给定数据定义域内的任意位置推导出该函数。

运行结果如图2-6所示。

图2-6 一维插值
3. 样条曲线

运行结果如图2-7所示。

图2-7 样条曲线插值
2.2.5 SciPy Ndimage
SciPy的ndimage子模块专用于图像处理,ndimage表示一个n维图像。
图像处理中一些最常见的任务如下:
- 图像的输入、输出和显示。
- 基本操作,如裁剪、翻转、旋转等。
- 图像过滤,如去噪、锐化等。
- 图像分割,如标记对应于不同对象的像素。
- 分类。
- 特征提取。
- 注册。
下面使用SciPy实现其中的一些功能。
1. 打开图像

运行结果如图2-8所示。

图2-8 打开图像
2. 图像倒置

运行结果如图2-9所示。

图2-9 图像倒置
3. 按指定的角度旋转图像

运行结果如图2-10所示。

图2-10 旋转图像
4. 模糊图像

代码说明:
sigma值表示5级模糊程度。通过调整sigma值,可以看到图像质量的变化。
运行结果如图2-11所示。

图2-11 模糊图像
2.2.6 SciPy优化算法
1. 梯度下降优化算法
求解方程:x2-2x的最小值,求解代码如下:

运行结果如图2-12所示。

图2-12 函数最小值
通过可视化结果可以发现,最小值比0略小。下面是梯度下降的实现代码:

运行结果:

结果显示最优值为-1,也满足可视化的判断。关于梯度下降算法的理论知识,读者可参考相关资料。
2. 最小二乘法优化算法

运行结果:
最小值是: = [1.0,1.0]
本节展示了SciPy在优化算法等领域的应用,有关具体理论知识,读者可以自行查找资料学习。