![Python数据预处理技术与实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/321/27563321/b_27563321.jpg)
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所示,包含最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解等模块。
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P36_6246.jpg?sign=1739292357-qNfle4TyQbU24ubQJncsTPsbQEGCBeV1-0-c256601bc68ecd42c58afcfc62a0111f)
图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所示的状态即表示安装成功。
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P36_6255.jpg?sign=1739292357-QOkjgqqh0XLXWPSorRK97mr7vci8hmSS-0-d6f7f547d9725eaca0efb837553a691d)
图2-4 验证SciPy是否成功安装
2. SciPy的特点
SciPy库依赖于NumPy,它提供了便捷且快速的N维数组操作。SciPy库与NumPy数组一起工作,并提供了许多用户友好和高效的实现方法,它们一起运行在所有流行的操作系统上,安装快速且免费。
SciPy提供了丰富的子模块,具体参见表2-5所示。
表2-5 SciPy的子模块
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-T37_38669.jpg?sign=1739292357-m4wsvI5u39fC2PqBJtwoTPHu9wJyH0Cs-0-8a3b6a262dff56b05f481d093f057bf8)
2.2.2 SciPy Linalg
SciPy Linalg模块包含线性代数函数,使用该模块可以计算逆矩阵、求特征值、解线性方程组以及求行列式等。
1. 求解线性方程组
我们使用Linalg求解如下方程组:
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P37_38671.jpg?sign=1739292357-Z4UfKPvblmz4F2wdVaS0yZBpwWXL3XlC-0-38a75caca7ace9a9e1b1892d24431b3c)
完整的代码实现如下:
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P37_38672.jpg?sign=1739292357-y2cFtKSfRNUoijjqWaWgU5J10Cobu3CV-0-2ebbe983a7db0f40b77b9a45f12c6ead)
代码说明:
数组a表示未知数的系数矩阵,数组b表示等号右边方程组值的矩阵。
运行结果:
线性方程组的解是: [ 2. -2. 8.]
2. 求解行列式
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P38_38677.jpg?sign=1739292357-5CZlopYBQKXayobcVWMMPefbhI3EbIu9-0-d1e563071f9bee2bf6066bc2c3edfba2)
运行结果:
行列式的解是:14-23=-2.0
3. 求解特征值和特征向量
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P38_38678.jpg?sign=1739292357-emWsnnWvvG8jHeoGsxXx9EafqiiYdosz-0-9999e3a0bf0cfcb23cc908a7bad0fa87)
代码说明:
- A表示方阵。
- 特征值λ和相应的特征向量v的关系是:Av=λv。
运行结果:
特征值:[-0.37228132+0.j 5.37228132+0.j] 特征向量:[[-0.82456484 -0.41597356] [ 0.56576746 -0.90937671]]
4. 奇异值分解(SVD)
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P38_38682.jpg?sign=1739292357-v3LVhNl7tz1gUsEektwznGmTf1Zfhck4-0-640dccd2513540aa8cd9a2e737982d3f)
代码说明:
- 矩阵a分解为两个酉矩阵(U和Vh)和一个奇异值。
- a=U*s*Vh。
运行结果:
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P39_6726.jpg?sign=1739292357-Z4voW5neu7QRNKezppMRojK9uPbV5I9l-0-cad358d2e741863942c2e56677c3896b)
2.2.3 SciPy文件操作
1. 保存MATLAB文件
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P39_38684.jpg?sign=1739292357-C4PfuyZCaS7v809GFD0kBfBp2sSi2m0r-0-b3e53102c5e3f97fbee6509fed312baa)
运行结果:
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P39_38686.jpg?sign=1739292357-Og1EdjXcrDjMZJxx0scXpIWwXWyahCqU-0-efef0737cd6ec44c18e0cf913a404a8c)
2. 查看MATLAB文件变量
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P39_38687.jpg?sign=1739292357-l7LQf83p3fD9oFJLd1Cb5J1zFsbYjXea-0-8a7319821bcd9647cede6db9e147b633)
运行结果:
[('vect', (1, 10), 'int32')]
2.2.4 SciPy插值
插值是在直线或曲线上的两点之间找到值的过程。插值不仅适用于统计学,而且在科学、商业和需要预测两个现有数据点之间的值时也很有用。
1. 绘制二维空间图
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P40_38690.jpg?sign=1739292357-XHCRH6DhqUyu4pSqvZGSiDjIm6ZKmyVA-0-a4e4d96e14a0ff75da4f82813b06080b)
二维空间的余弦散列点运行结果如图2-5所示。
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P40_38692.jpg?sign=1739292357-0Dco6IdqcpoTTwBKcme2kjlPDYBo4BFe-0-5c6e8792179ad982bace857d837f8a4e)
图2-5 绘制二维空间图
2. 一维插值
一种基于固定数据点来推导出函数的便捷方法,可以使用线性插值在给定数据定义域内的任意位置推导出该函数。
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P41_38693.jpg?sign=1739292357-58dqIXXntb5wAzJrJ9wju07WUngNQQtu-0-9d716ca0824088f2d04074fa1041d28a)
运行结果如图2-6所示。
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P41_7151.jpg?sign=1739292357-RFZWnyA1gePTzQkV4FnHjJXMCmQQLHqr-0-3f6d432ebd85c515d92a85a4c4bbee23)
图2-6 一维插值
3. 样条曲线
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P41_38694.jpg?sign=1739292357-NyCyuP0O7rG8QYRZ5ZMsOi9ai5pYixYj-0-5f0788ab35c1538dae174bd37046b607)
运行结果如图2-7所示。
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P42_7316.jpg?sign=1739292357-i1dLqAMKg32mQ8GgBc4vtm9fsjfHdcKi-0-a1c703da49d439348d82817ff4e95849)
图2-7 样条曲线插值
2.2.5 SciPy Ndimage
SciPy的ndimage子模块专用于图像处理,ndimage表示一个n维图像。
图像处理中一些最常见的任务如下:
- 图像的输入、输出和显示。
- 基本操作,如裁剪、翻转、旋转等。
- 图像过滤,如去噪、锐化等。
- 图像分割,如标记对应于不同对象的像素。
- 分类。
- 特征提取。
- 注册。
下面使用SciPy实现其中的一些功能。
1. 打开图像
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P42_38695.jpg?sign=1739292357-pZEoDhhMNQKf6eEX0gfboKzyZX3cXdKr-0-9c9bb13b977003bcdc5f4b1fdb1fe572)
运行结果如图2-8所示。
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P43_7420.jpg?sign=1739292357-k5KrPQrYFnv2RMimZAonuZXHfDc4pyyj-0-200a7cb571e2676502f4393608041433)
图2-8 打开图像
2. 图像倒置
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P43_38702.jpg?sign=1739292357-r9xQqD7P7QY0RR2lUsXFhTak7R59B0R0-0-d5dc5954b081a9432440c8d89d045992)
运行结果如图2-9所示。
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P44_7522.jpg?sign=1739292357-9CAwpohkx6rUJptPmzxOWqbwczp8CNKg-0-c56753da42415c7cd782a465ed5aa644)
图2-9 图像倒置
3. 按指定的角度旋转图像
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P44_38703.jpg?sign=1739292357-UWtk2IoTT0DsfZRnVIkN3GYpVpoQbUTf-0-fb76ef9d958854751550bd39c5b346b8)
运行结果如图2-10所示。
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P44_7620.jpg?sign=1739292357-mKDNwZ5DbyAUqyjhlla4JHbpra5lOt1i-0-50650b7ea834a244e83dc5482d729506)
图2-10 旋转图像
4. 模糊图像
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P45_38704.jpg?sign=1739292357-aCRAdxj1jHGByoBTes5BBEwewvi31Z6l-0-d3fa8616b0e73eb9d39c75af4b9c74fa)
代码说明:
sigma值表示5级模糊程度。通过调整sigma值,可以看到图像质量的变化。
运行结果如图2-11所示。
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P45_7723.jpg?sign=1739292357-W492SFlFcg3rM8zaJRH1N8tcuKzYTLdI-0-de0ff4fcd65c1ac6285cfa22d786df06)
图2-11 模糊图像
2.2.6 SciPy优化算法
1. 梯度下降优化算法
求解方程:x2-2x的最小值,求解代码如下:
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P45_38707.jpg?sign=1739292357-G2XCa9giFUsFHmpUGgRwWOPih0oUuaCL-0-58342069a320b428de7090a7d1c00d54)
运行结果如图2-12所示。
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P46_7799.jpg?sign=1739292357-5uGX4J0EWrZCYTlzmJig7B5ximwFcZcC-0-ea7b6b18d377b07c6d9429bde4c84f47)
图2-12 函数最小值
通过可视化结果可以发现,最小值比0略小。下面是梯度下降的实现代码:
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P46_38709.jpg?sign=1739292357-vwKzii4VG9mCLN8Qslgv66KG7nOQ4FCJ-0-5ee1f815c5d86c6d16ab0535526bee9a)
运行结果:
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P46_38711.jpg?sign=1739292357-1s2Qa1Ff5DfDUPoxJgvF1ESacg0xlSoW-0-daa5e6cd7197a3120e7067fee5f2ab0e)
结果显示最优值为-1,也满足可视化的判断。关于梯度下降算法的理论知识,读者可参考相关资料。
2. 最小二乘法优化算法
![](https://epubservercos.yuewen.com/FBFBF6/15825992205221306/epubprivate/OEBPS/Images/Figure-P47_38712.jpg?sign=1739292357-faFc5B5LsHweFJ9HEzCwUilIZTupzFzW-0-a091a1eea4d1721f77d31c814122dc7a)
运行结果:
最小值是: = [1.0,1.0]
本节展示了SciPy在优化算法等领域的应用,有关具体理论知识,读者可以自行查找资料学习。