如何優雅地用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進行科學計算?

系列的逐漸成熟,大多數問題已經被解決。


分享到:


相關文章: