![Python人工智能](https://wfqqreader-1252317822.image.myqcloud.com/cover/801/40107801/b_40107801.jpg)
2.3 SciPy科学计算库
SciPy库在NumPy库的基础上增加了众多的数学、科学及工程计算中常用的库函数。
2.3.1 初识SciPy
SciPy库依赖NumPy库,提供了便捷且快速的n维数组操作。SciPy库与NumPy数组一起工作,并提供了许多友好和高效的处理方法。例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵、常微分方差的求解等,功能十分强大。
由于SciPy也是Python的第三方库,需要另外安装:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-065-1.jpg?sign=1739313085-BIqTOpU4eHZcMVOtxBklq3dKY8KcLOHi-0-11ae0a7f625d7bc4f0e34f6482821164)
安装完成后,我们来查看SciPy版本,代码如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-065-2.jpg?sign=1739313085-C3oIJHHYUzR3P0nLHtbkRGEkYEYVD4CS-0-f5427cc4f111908c33696c701e8deb3a)
SciPy被组织覆盖成不同科学计算领域的子包,其模块功能如表2-6所示。
表2-6 SciPy模块功能
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-065-3.jpg?sign=1739313085-g82dxaKIukF6JjEXwDYWGGwGyZ9Psoyr-0-c1f1efc4082381616cb5e6f8a451cf61)
2.3.2 SciPy经典应用
SciPy功能强大,下面举例说明SciPy在各领域的应用,以便学习。
1. 积分
积分学不仅推动了数学的发展,而且也极大地推动了天文学、力学、物理学、化学、生物学、工程学、经济学等自然科学,以及社会科学及应用科学各个分支的发展,并在这些学科中有越来越广泛的应用。特别是计算机的出现,更有助于这些应用的不断发展。scipy.integration提供了多种积分模块,主要分为以下两类:一种是对给定的函数对象积分,如表2-7所示;另一种是对给定固定样本的函数积分。我们一般关注对数值积分的trapz函数和cumtrapz函数。trapz()使用复合梯形规则沿给定轴线进行积分,cumtrapz()使用复合梯形法则累计积分。
表2-7 积分函数(给定的函数对象)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-066-1.jpg?sign=1739313085-U2fMWsJ6IhHev13uKkLbf5j7fNofX7jq-0-8298acaf5c78d316feb3320f071fe87f)
下面通过例子演示利用SciPy求解积分问题。
【例2-14】 利用quad()计算定积分。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-066-3.jpg?sign=1739313085-tr6S0sjRklby1UMzFLx9uYjhKFzllDUK-0-b47e71b9ddaceba37e0f14d0330d2637)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-066-4.jpg?sign=1739313085-wl9WRPp3nm7JLV6OCD0F0L49ind1nSyi-0-e1b142336cb9374b078ae9a1033c96c0)
四元函数返回两个值,其中第一个数值是积分值,第二个数值是积分值绝对误差的估计值。
注意:由于quad()需要函数作为第一个参数,因此不能直接将exp作为参数传递。quad函数接受正和负无穷作为限制。
【例2-15】 求解双重积分。
解析:使用lambda表达式定义函数f,g和h。请注意,即使g和h是常数,它们可能在很多情况下必须定义为函数。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-067-1.jpg?sign=1739313085-oqiMN6gjVw3NXEES1SAs1UKBO2SdFRg1-0-2a025ee6f145bd7ca59898444b09cc64)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-067-2.jpg?sign=1739313085-mynWbVvOQEBJ6JrOnvlr5SysOfPtBdAA-0-7aace4245dd7c9651712aa3395aef7ec)
2. 插值
插值是在直线或曲线上的两点之间找到值的过程。这种插值工具不仅适用于统计学,而且在科学、商业或需要预测两个现有数据点内的值时也很有用。
在SciPy中可通过interp1d()来完成数据的插值,其语法格式为:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-067-3.jpg?sign=1739313085-XNygfCGL1AGYrh6GspyeODRpIFG2wKWj-0-b546bc57fd5e6bfb57676fb19598441a)
用x和y来逼近指定函数f:y=f(x)。interp1d()返回一个函数,调用该方法可使用插值来查找新点的值。
函数的参数含义如下。
• x:一维数组;
• y:插值函数中x对应值;
• kind:插值的类型,包含“linear”“nearest”“zero”“slinear”“quadratic”“cubic”“previous”“next”等。
【例2-16】 实现数据的插值。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-067-4.jpg?sign=1739313085-hvG6fbf9WOktblbo1blFuHoikdwYoN3H-0-ace303b614306f0b4f6349cf7cfbcbe1)
运行程序,效果如图2-6所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-068-1.jpg?sign=1739313085-Ess2QpuQNllv8M9MiXZl1ZEwNiETiKnU-0-3c259e457c9b1b8a90986db1d64445a9)
图2-6 插值效果
3. 峰度
峰度(Kurtosis)是指次数分布曲线顶峰的尖平程度,是次数分布的重要特征。在统计分析上,常以正态分布曲线为标准,观察比较某一次数分布曲线的顶端或平顶及尖平程度的大小。
峰度的测定,一般是采用统计动差方法,即以4阶中心动差V4为测定依据,将V4除以其标准差的4次方σ4,以消除单位量纲的影响,便于不同次数分布曲线的峰度比较,从而得到以无名数表示的相对数,即峰度的测定值(β)。计算公式为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-068-2.jpg?sign=1739313085-RoM6taJgqaoTNIDJCNBU54cgapNHXDvH-0-dd331d37219392da3697069a1608d508)
在SciPy中,通过stats.kurtosis()计算峰度。
【例2-17】 计算一随机数的峰度。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-068-3.jpg?sign=1739313085-jU4GRckLS0Uo1XbUTmhIJL58l8K37szZ-0-8b288258463802fd41154917da8e61c5)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-069-1.jpg?sign=1739313085-BepnSVBbyjM1Xjlf5znRZrZoHcKEGKdV-0-a82f9c6f82e1e690a6fe8e0859232620)
运行程序,输出如下,效果如图2-7所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-069-2.jpg?sign=1739313085-raKdyyr9xugH3CbncpHXQ0UByapTzI1a-0-018fd41b0e53efb0b29e3cf4bc3eefd1)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-069-3.jpg?sign=1739313085-Z7BKI4sDFMtjnnPxuKI3rVM0jd9EfjcV-0-5102013658f0f83363fb9363a72d9845)
图2-7 柱状图表示峰度效果
4. 最小二乘拟合
假设有一组实验数据,它们之间的函数关系为
,通过这些已知信息,需要确定函数中的一些参数项。例如,如果f是一个线性函数
,那么参数k和b就是我们需要确定的值。如果将这些参数用p表示,那么我们要找到一组p值,使得如下公式中的S函数最小:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-070-2.jpg?sign=1739313085-IoijTWd1QX9QUPQDsc9lvvrgvAkPBaBl-0-c463040e816286b8cea81d05ebd39cb7)
这种算法被称为最小二乘拟合(Least-square Fitting)。
在SciPy中的子函数库optimize已经提供了实现最小二乘拟合算法的函数leastsq。
【例2-18】 SciPy实现最小二乘拟合。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-070-3.jpg?sign=1739313085-1xn80XikAghvZqlqth8DpDiMmRAhJUNm-0-c02d22a6f3d767ef52957e6bb6b9b2e3)
运行程序,输出如下,效果如图2-8所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-071-1.jpg?sign=1739313085-8sfNpGUH0U0IoLoi1uKYgNsNVXmnIeEo-0-43ba9bcd50870ae43f6cd6c4039ddfc6)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-071-2.jpg?sign=1739313085-390thOKDHQbiPlUrr9zFPeC3ndhpim4o-0-841f2a4882f0af00b7bfb4d3cb781b14)
图2-8 最小二乘拟合效果
由结果可以看出,由于正弦函数的周期性,拟合参数规律走势和真实数据实际上是一致的。
5. 图像处理
图像识别是计算机对图像进行处理、分析和理解的过程,以识别各种不同模式的目标和对象。识别过程包括图像预处理、图像分割、特征提取和判断匹配。简单地说,图像识别就是要让计算机像人一样读懂图片的内容。借助图像识别技术,我们不仅可以通过图像搜索更快地获取信息,还可以产生一种新的与外部世界交互的方式,甚至会让外部世界更加智能地运行。
SciPy可实现对图像的基本操作,如裁剪、翻转、旋转、图像滤镜等,使用整个NumPy把图像处理成数组,如图2-9所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-071-3.jpg?sign=1739313085-AdsNVkQTy5aZVYQDQ2bcUa7H8En8becQ-0-47c40758b9f170631f9187fa864fb061)
图2-9 图像处理成数组
【例2-19】 利用SciPy实现图像处理。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-071-4.jpg?sign=1739313085-VZPT4B5LBvAk9SsONfJjvWGTZhnprCIb-0-598f5b4329ac05e148bbe9448f5cb33f)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-072-1.jpg?sign=1739313085-mZhVWt5TVoicGET1VjjoYMfsAX9GdBEM-0-41397770a55964d00052c89c45f456e8)
运行程序,图像处理效果如图2-10所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-072-2.jpg?sign=1739313085-mxrw6b3XBggzinA9VcyVBntuL4gKjgdS-0-487f50969d0ad4745506bdfe85460de2)
图2-10 图像处理效果