在今年的 PyCon 2017 上,来自科学 Python 社区的两位嘉宾发表了主题演讲:Jake VanderPlas 博士谈到科学家为何已经并且应当拥抱 Python;Kathryn Huff 博士则谈到 Python 社区如何以及为何能帮助科学界。这两场演讲合在一起,展现了科学研究与 Python 编程如何相辅相成的全景式观点;为什么当下许多在职科学家采用 Python 会受益最大,以及 Python 社区为何、如何能够有效推动科学研究。

Python 在科学计算中的“意外高效”
Jake VanderPlas 是华盛顿大学西雅图分校 eScience Institute 的一名天文学家。他也活跃于更广泛的科学 Python 社区,对 SciPy、scikit-learn 和 altair 等多个 Python 软件包都有贡献。
大多数人会想象天文学家常年蹲守在巨型望远镜前,通过镜片观测。但 Jake 向我们保证,绝大多数天文学家在职业生涯中从未真正通过望远镜观察过,而是把大部分数据采集时间花在了进行数据库查询上。不过,就天文学家的计算技能而言,数据库其实只是冰山一角——这些技能是他们要完成的任务所迫,而 Jake 给出了几个发人深省的例子。以下面这张关于 TRAPPIST-1 系外行星系统 的可视化为例:

我们很容易以为这是一张真实的照片,但其实这是艺术家的演绎:它不是原始数据。行星的存在是通过恒星掩食现象推断出来的,并在如下及后续的数据(图像由 Ethan Kruse 提供的数据)上进行统计建模:

这些推断和统计分析是如何完成的?当然是用 Python。并且是通过对该系统进行“极其复杂的统计建模”;此外,Jake 告诉我们,寻找这类系统“最终归结为在一个错综复杂的数据分析流水线中编写统计代码”。
这是 Jake 展示的多个使用 Python 进行数据处理与分析流水线的科学项目(属于天文学)之一。值得注意的是,这些项目不仅仅是用开源语言编写,它们的代码也都在 GitHub 上,例如 Kepler 和 JWST。后者试图通过探测其他行星大气中的气体来嗅探其化学组成,以寻找其他生命形式的化学特征——这些项目都使用 Python,托管在 GitHub 上,并使用 Jupyter 笔记本等工具。
这会不会只是个别案例,也就是少数 Python 项目是例外而非常态?在天文学领域并非如此。Jake 做过分析,显示使用 Python 的论文数量稳步上升:

看看这根 Python 的“曲棍球棒”!所以我们已经确认科学家使用 Python 的比例越来越高,但他们为什么用 Python?
在科学计算中使用 Python 的四大理由
Jake 问道:“为什么 Python 在科学中如此高效?”
1. 与其他语言的互操作性。
Python 是胶水: 过去,许多在职科学家为了把实验和/或数据转化为可交流的结果,需要一条尴尬、复杂、近乎荒诞的数据管线,涉及数据库查询、命令行技巧、使用专用或商业软件,再到数据可视化工具。Jake VanderPlas 引用 Dave Beazley 的话,部分因为他说得很到位:
“科学家……要与各种系统打交道,从仿真代码、数据分析包、数据库、可视化工具到自研软件——每一种都给用户提供不同的接口和文件格式。结果是,科学家可能会花大量时间只为把这些组件以某种方式拼到一起……”
而 Python 能与您在科学研究中几乎想用的一切工具互操作:它能绑定,是种“胶水”。正如 Jake 所说,Python 用来“把人们在用的杂七杂八工具粘合起来;高层的 Python 语法封装了底层的 C/Fortran 库”。
2. “电池自带”+ 第三方模块
研究科学家纷纷转向 Python(也因此那些尚未转向者“应该”转向)的另一个原因在于:
- 它“电池自带”的功能很多;以及
- 对于未内置的部分,有庞大的科学 Python(
SciPy)生态可作为第三方模块使用。
“电池自带”功能让您可以抓取网页、启动 Web 服务器、处理文件系统与数据库、读取 JSON 等等!
而“第三方”模块才是真正令人兴奋的地方。例子包括但绝不限于:
- 用于数组计算的 NumPy;
- 作为 Python 之上的 IDE 的 IPython 和 Jupyter,同时也是撰写科学文档、交流与协作研究/成果的方式;
- 用于扩展与分布式计算的 Numba 和 Dask;
- 用于 DataFrame 的 Pandas;
- 用于数据可视化的 Matplotlib 和 Bokeh(例如)(Python 自身就有一个完整的数据可视化库生态);
- 用于机器学习的 scikit-learn;
- 用于创建、操作和研究复杂网络的 NetworkX;
- 用于图像处理的 scikit-image;
- 用于马尔可夫链蒙特卡洛的 PyMC;
- 等等。
正如 Jake 所说,“如果您有问题要解决,很可能能找到一个库来帮忙,而且它多半就在 GitHub 上!”

3. 简洁与动态特性
Python 相对容易编写,尤其是与 C 等语言相比。正如 Jake 所说:“在 Python 中,尤其当您来自比如 C 的背景时,您写下自己想发生的事,它就会发生;有点像在写可执行的伪代码。”
他还引用了 Perry Greenfield 的话:“Python 是一门对开发者非常强大的语言,但对天文学家也很友好。让这两类人使用同一套工具,我认为带来了巨大的好处,而这往往未被注意或提及。”
得益于 IPython 和 Jupyter 笔记本等工具,有极好的机会进行动态编码和即席、迭代的探索式数据分析。这带来了低门槛,因为科学编程本身就是非线性、探索式的。Jake 指出,有些人可能抱怨或觉得这些工具较慢,但对于科学研究而言,关键在于开发速度,而不是执行速度,这使得这些工具非常理想。
4. 与科学相契合的开放精神
开源软件的精神非常契合科学研究所需的开放性(事实上,或许比很多科学研究本身更开放)。我们在讨论 Katy Huff 的主题演讲时会更详细展开,但科学不仅仅体现在发表的论文里,科学体现在结果、在复现结果的说明/流程与能力里;这正是开源软件开发所追求的。Jake 引用了 Buckheit 和 Donoho(1995,转述 Jon Claerbout)的一段话:
“关于计算结果的文章只是广告,不是学术。真正的学术是产生该结果的完整软件环境、代码和数据。”——Buckheit 和 Donoho,1995
开源软件以及 Python(科学及更广领域)生态的开放精神,提供了一个希望把我们从科学可重复性危机中解救出来的框架:“解决可重复性问题,靠的是开放科学”,而 Python 生态中科学研究的协作式、同行评审式、可在 GitHub 上发布的特性,是科学开放性的关键。如果我想了解 2016 年如何探测到(爱因斯坦预言的)引力波,我只需前往 LIGO 的代码库这里。又或者,如果您是越来越多使用 Astropy 包进行研究的天文学家之一,您可以在这里找到其代码和背后的社区,而其如此开放的事实,正是其社区效仿更大 Python 社区中开源与开放科学精神的直接结果。请看这张表,展示了 Jake(基于 Perry Greenfield 的观点进行改编)认为天文学界从 Python 社区学到的内容:

为科学而为
“我来此是为了借用你们的力量为我所用。”Kathryn Huff 博士对 PyCon 社区说道,随后她给出了充分而有说服力的论证,阐明了 Python 编程社区如何以及为什么能帮助科学拯救世界。她的主题演讲详细而热忱地论证了总体上的开源软件开发,尤其是 Python,如何在科学计算以及整个科学研究与实践中发挥了如此有效的作用。更进一步,她展示了众多场景,说明广大的 Python 编程与开发社区如何能用他们的 Python 技能帮助科学界、拯救世界。如果您认为水资源是人类的严峻问题,或者是健康、能源,Kathryn 都准备好了相应的项目和带有开放议题的 GitHub 代码库,供您立刻加入贡献。她给出了数十个开放项目与软件包的示例,其中包含您可以参与的问题。
Kathryn(Katy)是一名核工程师,SciPy 社区的长期贡献者,参与《开源软件期刊》(Journal of Open Source Software),并投入大量时间于 The Hacker Within 以及 Software 和 Data Carpentries,这些项目帮助科学家更好地使用计算机并取得发现,从而提升科学家使用计算机的可重复性与便捷性。
Katy 的使命是改进核能的生产方式;而她的首选工具是什么?Python!在深入阐述 Python 社区能以多种方式帮助科学研究群体之前,Katy 先给出了一个有力论证,说明这为何确有必要。Katy 引用 R. K. Merton(1945)的话来描述科学需要严谨、结构化、群体审视(这正是有组织的怀疑论的良好工作定义);这些无可争辩地是开源 Python 社区的特质。

Katy 通过列举科学的基本信条强调了其重要性,并指出自毕达哥拉斯时代(公元前 6 世纪)以来,开源软件开发社区比任何其他群体都更好地坚守了这些信条。这些科学的基本信条包括:
- 同行评审
- 怀疑精神
- 透明性
- 署名
- 问责
- 协作
- 影响力
计算机“应该”帮助科学家做到以下几点:

那么,促使更多科学家使用 Python 等开源软件,让计算机真正帮助他们的挑战是什么?
因此,Katy 向 Python 社区发出号召:
“我希望邀请您参与。”
这种动员也是在职研究科学家使用 Python 的另一个理由:他们可以调用一个庞大的开源程序员社区的力量。正如前述,Katy 还参与了另一种路径,即通过教育在职科学家更好地使用计算机完成工作。类似的项目有不少。我建议所有在职科学家都去了解一下 Software Carpentry 和 Data Carpentry,看看它们是否能帮助您的团队、系所或学校(答案是:只要您需要计算,它们多半能帮上忙)。
那么,Katy Huff 博士建议程序员如何提供帮助?四个简单步骤:
- 保持好奇;
- 选择一个项目;
- 为科学做贡献;
- 拯救世界。
为何用 Python 开展研究?
- Python 生态包含一套成熟且仍在演进的计算工具,供在职科学家使用。
- 科学家正因以下原因而大规模转向 Python:
- 与其他语言的互操作性;
- “电池自带”,且几乎所有需求都有第三方模块;
- 简洁与动态特性;
- 开放精神与科学高度契合。
- 科学 Python 社区不断壮大,相关库也在持续开发;这个社区是开放的;
- 开源开发社区比任何其他群体都更能坚守科学研究的基本信条;这些信条包括:
- 同行评审
- 怀疑精神
- 透明性
- 署名
- 问责
- 协作
- 影响力
- 更广泛的 Python 程序员社区中有许多并非科学家,但他们愿意为 Python 在科学与社会问题上的影响做出贡献,支持他们所信仰的议题;稍微改动一下 Perry Greenfield 的话:
“Python 是一门对开发者非常强大的语言,但对[科学家]也很友好。让这两类人使用同一套工具,我认为带来了巨大的好处,而这往往未被注意或提及。”
如果您有任何想法、回应或感想,欢迎在 Twitter 上联系我:@hugobowne。
在今年的 PyCon 2017 上,来自科学 Python 社区的两位嘉宾发表了主题演讲:Jake VanderPlas 博士谈到科学家为何已经并且应当拥抱 Python;Kathryn Huff 博士则谈到 Python 社区如何以及为何能帮助科学界。这两场演讲合在一起,展现了科学研究与 Python 编程如何相辅相成的全景式观点;为什么当下许多在职科学家采用 Python 会受益最大,以及 Python 社区为何、如何能够有效推动科学研究。
Python 在科学计算中的“意外高效”
Jake VanderPlas 是华盛顿大学西雅图分校 eScience Institute 的一名天文学家。他也活跃于更广泛的科学 Python 社区,对 SciPy、scikit-learn 和 altair 等多个 Python 软件包都有贡献。
大多数人会想象天文学家常年蹲守在巨型望远镜前,通过镜片观测。但 Jake 向我们保证,绝大多数天文学家在职业生涯中从未真正通过望远镜观察过,而是把大部分数据采集时间花在了进行数据库查询上。不过,就天文学家的计算技能而言,数据库其实只是冰山一角——这些技能是他们要完成的任务所迫,而 Jake 给出了几个发人深省的例子。以下面这张关于 TRAPPIST-1 系外行星系统 的可视化为例:
我们很容易以为这是一张真实的照片,但其实这是艺术家的演绎:它不是原始数据。行星的存在是通过恒星掩食现象推断出来的,并在如下及后续的数据(图像由 Ethan Kruse 提供的数据)上进行统计建模:
这些推断和统计分析是如何完成的?当然是用 Python。并且是通过对该系统进行“极其复杂的统计建模”;此外,Jake 告诉我们,寻找这类系统“最终归结为在一个错综复杂的数据分析流水线中编写统计代码”。
这是 Jake 展示的多个使用 Python 进行数据处理与分析流水线的科学项目(属于天文学)之一。值得注意的是,这些项目不仅仅是用开源语言编写,它们的代码也都在 GitHub 上,例如 Kepler 和 JWST。后者试图通过探测其他行星大气中的气体来嗅探其化学组成,以寻找其他生命形式的化学特征——这些项目都使用 Python,托管在 GitHub 上,并使用 Jupyter 笔记本等工具。
这会不会只是个别案例,也就是少数 Python 项目是例外而非常态?在天文学领域并非如此。Jake 做过分析,显示使用 Python 的论文数量稳步上升:
看看这根 Python 的“曲棍球棒”!所以我们已经确认科学家使用 Python 的比例越来越高,但他们为什么用 Python?
在科学计算中使用 Python 的四大理由
Jake 问道:“为什么 Python 在科学中如此高效?”
1. 与其他语言的互操作性。
Python 是胶水: 过去,许多在职科学家为了把实验和/或数据转化为可交流的结果,需要一条尴尬、复杂、近乎荒诞的数据管线,涉及数据库查询、命令行技巧、使用专用或商业软件,再到数据可视化工具。Jake VanderPlas 引用 Dave Beazley 的话,部分因为他说得很到位:
而 Python 能与您在科学研究中几乎想用的一切工具互操作:它能绑定,是种“胶水”。正如 Jake 所说,Python 用来“把人们在用的杂七杂八工具粘合起来;高层的 Python 语法封装了底层的 C/Fortran 库”。
2. “电池自带”+ 第三方模块
研究科学家纷纷转向 Python(也因此那些尚未转向者“应该”转向)的另一个原因在于:
SciPy)生态可作为第三方模块使用。“电池自带”功能让您可以抓取网页、启动 Web 服务器、处理文件系统与数据库、读取 JSON 等等!
而“第三方”模块才是真正令人兴奋的地方。例子包括但绝不限于:
正如 Jake 所说,“如果您有问题要解决,很可能能找到一个库来帮忙,而且它多半就在 GitHub 上!”
3. 简洁与动态特性
Python 相对容易编写,尤其是与 C 等语言相比。正如 Jake 所说:“在 Python 中,尤其当您来自比如 C 的背景时,您写下自己想发生的事,它就会发生;有点像在写可执行的伪代码。”
他还引用了 Perry Greenfield 的话:“Python 是一门对开发者非常强大的语言,但对天文学家也很友好。让这两类人使用同一套工具,我认为带来了巨大的好处,而这往往未被注意或提及。”
得益于 IPython 和 Jupyter 笔记本等工具,有极好的机会进行动态编码和即席、迭代的探索式数据分析。这带来了低门槛,因为科学编程本身就是非线性、探索式的。Jake 指出,有些人可能抱怨或觉得这些工具较慢,但对于科学研究而言,关键在于开发速度,而不是执行速度,这使得这些工具非常理想。
4. 与科学相契合的开放精神
开源软件的精神非常契合科学研究所需的开放性(事实上,或许比很多科学研究本身更开放)。我们在讨论 Katy Huff 的主题演讲时会更详细展开,但科学不仅仅体现在发表的论文里,科学体现在结果、在复现结果的说明/流程与能力里;这正是开源软件开发所追求的。Jake 引用了 Buckheit 和 Donoho(1995,转述 Jon Claerbout)的一段话:
开源软件以及 Python(科学及更广领域)生态的开放精神,提供了一个希望把我们从科学可重复性危机中解救出来的框架:“解决可重复性问题,靠的是开放科学”,而 Python 生态中科学研究的协作式、同行评审式、可在 GitHub 上发布的特性,是科学开放性的关键。如果我想了解 2016 年如何探测到(爱因斯坦预言的)引力波,我只需前往 LIGO 的代码库这里。又或者,如果您是越来越多使用 Astropy 包进行研究的天文学家之一,您可以在这里找到其代码和背后的社区,而其如此开放的事实,正是其社区效仿更大 Python 社区中开源与开放科学精神的直接结果。请看这张表,展示了 Jake(基于 Perry Greenfield 的观点进行改编)认为天文学界从 Python 社区学到的内容:
为科学而为
“我来此是为了借用你们的力量为我所用。”Kathryn Huff 博士对 PyCon 社区说道,随后她给出了充分而有说服力的论证,阐明了 Python 编程社区如何以及为什么能帮助科学拯救世界。她的主题演讲详细而热忱地论证了总体上的开源软件开发,尤其是 Python,如何在科学计算以及整个科学研究与实践中发挥了如此有效的作用。更进一步,她展示了众多场景,说明广大的 Python 编程与开发社区如何能用他们的 Python 技能帮助科学界、拯救世界。如果您认为水资源是人类的严峻问题,或者是健康、能源,Kathryn 都准备好了相应的项目和带有开放议题的 GitHub 代码库,供您立刻加入贡献。她给出了数十个开放项目与软件包的示例,其中包含您可以参与的问题。
Kathryn(Katy)是一名核工程师,SciPy 社区的长期贡献者,参与《开源软件期刊》(Journal of Open Source Software),并投入大量时间于 The Hacker Within 以及 Software 和 Data Carpentries,这些项目帮助科学家更好地使用计算机并取得发现,从而提升科学家使用计算机的可重复性与便捷性。
Katy 的使命是改进核能的生产方式;而她的首选工具是什么?Python!在深入阐述 Python 社区能以多种方式帮助科学研究群体之前,Katy 先给出了一个有力论证,说明这为何确有必要。Katy 引用 R. K. Merton(1945)的话来描述科学需要严谨、结构化、群体审视(这正是有组织的怀疑论的良好工作定义);这些无可争辩地是开源 Python 社区的特质。
Katy 通过列举科学的基本信条强调了其重要性,并指出自毕达哥拉斯时代(公元前 6 世纪)以来,开源软件开发社区比任何其他群体都更好地坚守了这些信条。这些科学的基本信条包括:
计算机“应该”帮助科学家做到以下几点:
那么,促使更多科学家使用 Python 等开源软件,让计算机真正帮助他们的挑战是什么?
因此,Katy 向 Python 社区发出号召:
这种动员也是在职研究科学家使用 Python 的另一个理由:他们可以调用一个庞大的开源程序员社区的力量。正如前述,Katy 还参与了另一种路径,即通过教育在职科学家更好地使用计算机完成工作。类似的项目有不少。我建议所有在职科学家都去了解一下 Software Carpentry 和 Data Carpentry,看看它们是否能帮助您的团队、系所或学校(答案是:只要您需要计算,它们多半能帮上忙)。
那么,Katy Huff 博士建议程序员如何提供帮助?四个简单步骤:
为何用 Python 开展研究?
如果您有任何想法、回应或感想,欢迎在 Twitter 上联系我:@hugobowne。