如何优雅地用Python进行科学计算?



众所周知,Python 是最易上手的一门编程语言,它代码简洁、短小,易于阅读,还具有跨平台性、解释性、可嵌入式等等特点。其实,Python 还有一个最大的优势就是有着丰富的库,除了一些标准库之外,第三方库更是必不可少。

如果你从事数据相关工作,你可能会用到 Numpy、Pandas,机器学习的话会用 Scikit-Learn,用 Python 做可视化会用到 Matplotlib 等等。想必大家在工作中都会经常与这些库打交道。

如何优雅地用Python进行科学计算?

我们曾出版过一本《Python数据科学手册》,目前豆瓣评分 8.8,是一本 Python 第三方库的速查手册。主要介绍了如何利用 IPython、NumPy、Pandas、Matplotlib 和 Scikit-Learn 这 5 大工具高效存储、处理和分析数据,也是机器学习的必读书之一。

当然,如果你想用 Python 做科学计算,并且在速查手册中找不到合适的库,那不妨试试这个,你一定对这个名字早有耳闻,那就是 SciPy。

介绍它的教程和文档可是不少,今天也给大家推荐一本专门讲解 SciPy 的新书《Python科学计算最佳实践》,跟文档比起来,这本书不但会教你如何编写有效的代码,还会激励你将代码变得更加酷炫!


如何优雅地用Python进行科学计算?


Elegant SciPy: The Art of Scientific Python

作者:Juan Nunez-Iglesias,Stéfan van der Walt,Harriet Dashnow

  • 一本书了解开源 Python 算法库和数学工具包 SciPy
  • 生动展示如何通过 Python 的科学计算工具达到事半功倍的效果

书中结合大量代码实例,详尽展示了 SciPy 的强大科学计算能力,包括用 NumPy 和 SciPy 进行分位数标准化,用 ndimage 实现图像区域网络,频率与快速傅里叶变换,用稀疏坐标矩阵实现列联表,SciPy中的线性代数,SciPy 中的函数优化等。



我们先来简单说一下这本书,这本书原版书名为 Elegant SciPy,为什是 Elegant 而不是其他形容词呢?我们先花点时间说一下“优雅”这个词。

多数人会用这个词来形容某物在视觉上的简单、时髦和优美,比如第一代 iPhone。但很少有人用计算机算法来定义优雅。

一段良好的代码在感觉上就是正确的。当查看这种代码时,它的意图是明确的,形式是简洁的(但不至于晦涩),而且能高效地完成当前工作。分析优雅代码的乐趣是可以找出其中隐藏的知识,以及由其激发出的解决新编程问题时的创造性。

讽刺的是,创造性会引诱我们为了炫耀自己的睿智而编写出难以理解的代码,而承受这种代价的是代码阅读者。PEP 8(“Python 编码规范”)和 PEP 20(“Python 之禅”)提醒我们,阅读代码要比编写代码频繁得多,因此可读性最重要。

优雅代码的简洁性来自抽象和正确使用函数,而非大量的函数嵌套调用。可能需要一两分钟来领会这种代码,但最终肯定有一个恍然大悟的时刻。一旦搞清楚代码的各个组成部分,它的正确性就显而易见了。要想提高代码的可读性,可以使用清晰明确的变量和函数名称,并精心编写注释,注释不仅要描述代码,还应该解释代码。

软件工程师 J. Bradford Hipps 最近在《纽约时报》上发表了一篇文章,他认为,“要想写出更好的代码,就应该阅读一下弗吉尼亚 • 伍尔芙的作品”。文章选段如下:

在实践中,软件开发更多的时候是一种创造性活动,绝不是机械的算法。开发人员站在源代码编辑器前,就像是作家面对着空白的稿纸。……他们都对循规蹈矩的做事方式表现出理所当然的焦躁,并从内心深处渴望打破常规。当完成一段程序或一页作品时,它们的质量评判标准在很大程度上是一样的:优雅、简洁、内聚,没有一点故弄玄虚的东西,甚至堪称漂亮。


这也是这本书所持的立场。

介绍完优雅这个词之后,我们就来说说SciPy。


什么是SciPy?

SciPy 是一个应用开发者与工程师们使用的机器学习库,包含了优化器、线性代数、积分、插值、快速傅立叶变换、信号和图像处理、统计等子模块。SciPy 库的主要功能是基于 Numpy 来实现的,它的数组操作就是使用了 Numpy 的数组操作。


为什么使用SciPy

NumPy 和 SciPy 共同组成了 Python 科学应用生态系统的核心。SciPy 软件库实现了很多用于科学数据处理的函数,比如用于统计学、信号处理、图像处理和函数优化。SciPy 是建立在 NumPy 之上的,NumPy 是 Python 中用于数值型数组计算的库。

在过去的几年中,基于 NumPy 和 SciPy,一个包括应用和库文件的完整生态系统迅速发展起来,并在天文学、生物学、气象学和气候科学,以及材料科学等多个学科得到了广泛应用。

这种发展方兴未艾。2014 年,Thomas Robitaille 和 Chris Beaumont 整理了 Python 在天文学领域不断增长的应用。


如何优雅地用Python进行科学计算?


很明显,SciPy 及其相关的库在未来几年将支持大量科学数据分析任务。

再举个例子,Software Carpentry 是一个专门向科研人员传授计算技能的组织,其中最常用的语言就是 Python,现在相关课程也已经供不应求。


天翻地覆:从Python 2到Python 3

在使用 Python 的过程中,你应该对哪个 Python 版本更好的争论有所耳闻。或许你对此非常诧异,难道不是最新版本更好吗?(先剧透一下:确实是最新版本更好。)

2008 年末,Python 核心开发团队发布了 Python 3,对这种语言进行了一次重大更新,主要改进包括更好的 Unicode(国际标准)文本处理、类型的一致性以及流式数据处理等。正如 Douglas Adams 对宇宙初创的风趣评论一样,“这令很多人勃然大怒,被普遍认为是一种倒退”。这是因为,如果不进行一些修改,Python 2.6 或 Python 2.7 的代码一般不能由 Python 3 直接解释(尽管这些改动一般没有什么破坏性)。

向前发展与向后兼容总是要进行一番角力。对于这个问题,Python 核心团队决定做一个彻底的改变,消除 Python(特别是底层 C 语言 API)中的不一致性,从而使 Python 成为一门 21 世纪的语言(Python 1.0 发布于 1994 年,距今已有 20 余年,在技术界已经是相当长的时间)。以下是 Python 3 中的一处改进。

如何优雅地用Python进行科学计算?


为什么非要不嫌麻烦地加上一对括号呢?是的,括号确实比以前麻烦,但如果你想要输出到另一个流中,如常用于存放调试信息的标准错误流,该怎么办呢?

如何优雅地用Python进行科学计算?


此时这种改动看起来就很有价值。Python 2 中的代码到底表示什么意思呢?我们确实不大明白。

Python 3 的另一项改进是将整数除法修改为符合大多数人习惯的形式。(注意:>>> 表示我们正在 Python 交互式环境中进行输入。)

如何优雅地用Python进行科学计算?


2015 年,Python 3.5 引入的新矩阵乘法操作符 @ 也非常令人激动,你也会在书里看到更多相关的知识。

Python 3 中的最大改进可能就是对 Unicode 的支持,Unicode 是一种文本编码方式,它不但包括英文字母表,还包括世界上所有的字母表。Python 2 允许你定义一个 Unicode 字符串,如下所示。

如何优雅地用Python进行科学计算?


但在 Python 3 中,一切都是 Unicode。

如何优雅地用Python进行科学计算?


Python 核心团队做出了正确的决策,在 Python 代码中一视同仁地支持所有语言的字符。如今这个决策看起来尤其英明,因为大多数新程序员来自于非英语国家。考虑到互操作性,我们还是建议在多数代码中使用英文字符,但这种能力迟早会派上用场,比如在包含大量数学公式的 Jupyter 笔记本中。

在 IPython 终端或 Jupyter 笔记本中,先输入一个 LaTeX 符号名称,紧接着按 Tab 键,就可以将其转换为 Unicode。例如,\bet 可以变为 β。

Python 3 的更新也破坏了很多现有的

如何优雅地用Python进行科学计算?

版代码,一些代码比以前运行得更慢。尽管会有这样的问题,我们还是建议所有人都尽快升级到 Python 3(Python

如何优雅地用Python进行科学计算?

的维护期到 2020 年就结束了),因为随着

如何优雅地用Python进行科学计算?

系列的逐渐成熟,大多数问题已经被解决。


分享到:


相關文章: