5.4 SciPy
在Python的科学计算中,SciPy为数学、物理、工程等方面涉及的科学计算提供无可替代的支持,其主要子模块汇总如表5-3所示。它是一个基于NumPy的高级模块,在符号计算、信号处理、数值优化等任务中有突出表现,覆盖了绝大部分科学计算领域。
表5-3 SciPy主要子模块汇总表
我们在5.2节中提到,NumPy引入二维数组和矩阵,使得它们作为与表格最相似的数据结构,能极大提高数据分析的效率。
在NumPy基础上发展而来的SciPy,拥有更丰富的外延。在此,仅向读者介绍SciPy基础。其中最重要的是:“向量化思想”,包括“符号计算”和“函数向量化”。
1.符号计算
众所周知,程序中使用的变量仅代表一个空间,真正参与运算的是这个空间中存放的内容或取值。也就是说,数学中最常见的代数表达式,如x2 +x+1,在程序中是没有意义的。
但这就是SciPy的特别之处。它能够支持符号计算。我们有两种等价的方式去处理一元n次多项式,从而可以不加赋值地进行符号计算。其中一种方式就是使用NumPy中的plot1d类。它可以通过多项式系数或者多项式的根显式地声明一个多项式,并进行加、减、乘、除、积分、求导等操作,如代码清单5-14所示。
代码清单5-14 符号计算例子
# -*- coding:utf-8 -*- from scipy import poly1d p = poly1d([3, 4, 5]) print p # result: # 2 # 3 x + 4 x + 5 print p*p # result: # 4 3 2 # 9 x + 24 x + 46 x + 40 x + 25 print p.integ(k=6) # 求 p(x)的不定积分,指定常数项为 6 # result: # 3 2 # 1 x + 2 x + 5 x + 6 print p.deriv() # 求 p(x)的一阶导数 # result: # 6 x + 4 p([4, 5]) # 计算每个值代入 p(x)的结果 # result: # array([ 69, 100])
*代码详见:示例程序/code/5-4.py
代码清单5-14中输出的第一个结果实际上代表一个多项式:3x2 +4x+5。同样地,第二个结果代表9x4 +24x3 +46x2 +40x+25.可以说,NumPy和SciPy让Python能够完成科学计算的需求,这也给读者一个使用Python替代MATLAB的理由。在接下来的章节,读者将会看到Matplotlib对MATLAB在绘图方面的模仿与改进。
2.函数向量化
在MATLAB中,我们把大部分的数据维护成向量的形式。而编写MATLAB代码时,为了增强程序的健壮性,通常的做法是使函数接受向量形式的参数传入,以达到高效的运算或处理效率。
Python无法彻底地支持这一点,但SciPy很好地弥补了这个缺憾。有一个很特别的用法,便是将函数本身作为参数,传递给vectorize()函数作为其参数,经过处理返回一个能接受向量化输入的函数,如代码清单5-15所示。
代码清单5-15 函数向量化示例
# -*- coding:utf-8 -*- import numpy as np def addsubtract(a, b): # 按照原始定义,仅接受可比较的数字作为参数 if a > b: return a - b else: return a + b vec_addsubtract = np.vectorize(addsubtract) print vec_addsubtract([0, 3, 6, 9], [1, 3, 5, 7]) # result: # [1 6 1 2]
*代码详见:示例程序/code/5-4.py
当你使用SciPy模块时,你很可能需要优化、信号处理、函数变换等功能。如果你打算自己实现这些功能以应对特殊的需求,那么这个特别的函数将使你的工作量大大减少。同时,你的代码将更加优雅。
带上这种向量化操作的思想深入学习SciPy,相信读者会更加容易上手。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论