返回介绍

5.4 SciPy

发布于 2024-01-21 22:13:25 字数 2127 浏览 0 评论 0 收藏 0

在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文