注意: 雖然 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 計算機圖形、影像處理和視覺化系統。