注意: 虽然 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 月创建了一个名为 VTK-CFD 的基于 GUI 的工具。这个工具经过了几轮改进,直到我最终完全重写了它并在 2001 年 5 月发布了 MayaVi。

结果

MayaVi 是用 100% 纯 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 对象来将其保存到磁盘。使用内省来编写此类数据驱动的模块避免了大量的体力编码,并使 MayaVi 随着更多 VTK 对象的定义而自我扩展。

由于 Python 是一种脚本语言,因此它是 MayaVi 扩展语言的自然选择。因此,MayaVi 不仅是用 Python 编写的,还可以由使用 Python 的最终用户编写脚本,以便使用其他有用的功能对其进行扩展。

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

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

即便如此,我还是在相当于大约 4 个月全职工作的时间里编写了大约 16,000 行 Python 代码,并产生了一个成功的最终产品。这项工作分布在约 5 个版本的 VTK-CFD 和 3 个版本的 MayaVi 上。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(MayaVi 基于的开源 3D 计算机图形、图像处理和可视化系统)做出了贡献。