注意: 虽然 JavaScript 对于本网站不是必需的,但您与内容的互动将受到限制。请开启 JavaScript 以获得完整的体验。

Python 用于科学数据可视化

背景

MayaVi 是一个完全用 Python 编写的开源科学数据可视化工具。

我于 2000 年开始开发 MayaVi。那时,我的几位同事需要可视化他们的计算流体力学 (CFD) 数据,但唯一可用的合适工具是商业的、闭源的程序,价格高得令人望而却步。

我们查看了一些开源工具作为替代方案。OpenDX 刚刚发布,当时我很难让它正常运行。OpenDX 也是一个相当复杂的系统,学习曲线很陡峭。

另一个可视化/图形库 VTK 也作为开源提供。VTK 是一个用 C++ 编写的极其强大的可视化库。它非常便携,可以在各种 Unix、Windows 和最近的 Mac OS X 上运行。

VTK 被选为最合适的解决方案,但它不足以解决手头的问题。在 VTK 库之上还需要一个应用程序,这样只有专业领域知识而非编程经验的用户才能在电脑前可视化他们的数据。

选择 Python

尽管我之前的大部分经验都是 C 和 C++,但我认为另一种语言可能更适合快速开发图形用户界面。VTK 是用 C++ 编写的,但它也已被封装用于 Python、Tcl 和 Java。我查看了其中的每一种。

我排除了 Tcl,因为我觉得 Python 的语法更清晰,而且我听说大型 Tcl 程序可能难以维护。Java 的缺点是每次代码更改都需要编译,而且在任何最新浏览器中运行代码的能力对这个项目没有用。与 Python 相比,Java 冗长的语法也是一个不利因素。Python 和 Java 一样便携,而且是一种更容易学习和使用的语言。我还阅读了 Python 教程,看了一些 Python 程序,并且非常喜欢这种语言的简洁性、面向对象的特性、动态数据类型和庞大的标准库。

从几个使用 VTK 的简单 Python 脚本开始,我能够让我的同事们相当快地使用一些自定义 CFD 可视化脚本。当时我仍在学习 Python 和 Tkinter(MayaVi 中使用的 GUI 工具包),并于 2000 年 6 月创建了一个基于 GUI 的工具,名为 VTK-CFD。它经过了多轮改进,直到我最终完全重写并于 2001 年 5 月发布了 MayaVi。

结果

MayaVi 完全用纯 Python 编写,凭借 VTK、Python 和 Tkinter 的可移植性,它可以在 Linux、Unix 和 Windows 上运行。Python 被证明是简单、易学且极其强大的。它的交互式解释器在学习和实验时是一个巨大的优势。它还拥有优秀的免费文档。

我发现开发周期非常快,因为 Python 既是面向对象的又是解释型的。程序可以从面向对象的角度精心设计,因此更易于维护,但每次更改代码时都无需等待编译。

Python 的可读性和动态类型使其更容易编写、维护和扩展代码。我从不必担心类型,这让我可以专注于手头的问题,而不是与语言及其语法作斗争。这使我比使用 C 和 C++ 时效率更高。例如,我能够用仅仅 400 行代码编写一个带有 GUI 和搜索引擎的完整 VTK 文档浏览器。

Mayavi Screen Shot

流体流过圆柱形柱体,显示配置对话框、VTK 管道和 VTK 文档浏览器。数据由 NASA 提供。 放大

对内省的出色支持,加上全面的标准库,使得编写数据驱动的代码(如 vtkPipeline 浏览器)变得容易。这会在运行时自动生成一个 GUI,显示 VTK 图形管道。它还通过使用 Python 的正则表达式模块解析对象的方法,对其进行分类,并相应地构建 GUI,为任何 VTK 对象生成一个 GUI 配置对话框。此代码也用于 MayaVi 的持久化机制,该机制可以通过在运行时检查 VTK 对象来将大多数 VTK 对象保存到磁盘。使用内省来编写这些数据驱动模块避免了大量的手动编码,并使得 MayaVi 在定义更多 VTK 对象时能够自我扩展。

由于 Python 是一种脚本语言,它自然而然地成为 MayaVi 的扩展语言。因此,MayaVi 不仅是用 Python 编写的,还可以由使用 Python 的最终用户编写脚本,以通过附加的有用功能对其进行扩展。

我不是软件开发人员,也不是计算机科学家。我也不是图形专家。虽然我在 C/C++ 方面有相当多的编程经验,但当我开始这个项目时,我对 Python 知之甚少。然而,我只使用它的教程和标准 Python 文档就能够学习 Python,然后能够快速开发一个重要的应用程序。我很高兴 Python 如此容易学习,并且如此容易地应用于非琐碎的任务。

重要的是要指出,这个项目对我来说只是业余活动,这意味着我几乎没有持续的时间来从事它。我是唯一的开发人员,我必须自己编写代码、维护网页、编写文档并回答用户问题。

即便如此,我还是在大约相当于 4 个月的全职工作中编写了大约 16,000 行 Python 代码,并成功生产出最终产品。这项工作分布在 VTK-CFD 的大约 5 个版本和 MayaVi 的 3 个版本中。MayaVi 已从 SourceForge 下载超过 12,000 次,在三个月内最新版本下载量超过 3,500 次。现在,全世界有成千上万的用户在许多研究领域应用 MayaVi。它最近已为 Debian Linux 打包,并包含在其最新版本 Woody 中。

结论

如果不是 Python,MayaVi 就不会存在。用 Python 编程是一种乐趣,而且非常容易,即使是业余项目也能非常成功地完成其设定的目标。没有主要的移植问题,MayaVi 在 Linux、Unix 和 Windows 下运行良好,我几乎没有做任何修改。总的来说,这是一次使用 Python 的美妙经历。我学到了很多,通过它变得非常高效,并希望也能通过我编写的工具让其他人变得高效。

关于作者

Prabhu Ramachandran 是印度金奈马德拉斯印度理工学院的航空航天工程师和博士生。作为一名 OSS 和 GNU/Linux 的倡导者,Prabhu 还为 VTK 做出了贡献,VTK 是 MayaVi 所基于的开源 3D 计算机图形、图像处理和可视化系统。