Numerical Python (通常稱為 NumPy) 是一個廣為應用的 Python 擴充庫,用於快速處理任意維數的固定類型數組。由於底層代碼是充分最佳化的 C 語言代碼,因而對數組的主要操作在 NumPy 調用中執行時,速度不再受到 Python 解譯器的限制。因為 NumPy 已經取得了這樣的成功,所以 NumPy 的開發人員將用一個叫做 Numarray 的新模組來取代 NumPy,新模組基本上 (但並不是完全) 與 NumPy 相容。在本文中,David 介紹了 NumPy 的一般功能,以及 Numarray 將要帶來的一些特殊改進。
要瞭解 Numerical Python 軟體包的第一件事情是,Numerical Python 不會讓您去做標準 Python 不能完成的任何工作。它只是讓您 以快得多的速度去完成標準 Python 能夠完成的相同任務。實際上不僅僅如此;許多數組操作用 Numeric 或者 Numarray 來表達比起用標準 Python 資料類型和文法來表達要優雅得多。不過,驚人的速度才是吸引使用者使用 Numerical Python 的主要原因。
其實,Numerical Python 只是實現了一個新的資料類型:數組。與可以包含不同類型元素的列表、元組和詞典不同的是,Numarray 數組只能包含同一類型的資料。Numarray 數組的另一個優點是,它可以是多維的 -- 但是數組的維度與列表的簡單嵌套稍有不同。Numerical Python 借鑒了程式員的實踐經驗(尤其是那些有科學計算背景的程式員,他們抽象出了 APL、FORTRAN、MATLAB 和 S 等語言中數組的最佳功能),建立了可以靈活改變形狀和維度數組。我們很快會回來繼續這一話題。
在 Numerical Python 中對數組的操作是 按元素進行的。雖然二維數組與線性代數中的矩陣類似,但是對它們的操作 (比如乘) 與線性代數中的操作 (比如矩陣乘) 是完全不同的。
讓我們來看一個關於上述問題的的具體例子。在純 Python 中,您可以這樣建立一個“二維列表”:
清單 1. Python 的嵌套數組
>>> pyarr = [[1,2,3],
... [4,5,6],
... [7,8,9]]
>>> print pyarr
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> pyarr[1][1] = 0
>>> print pyarr
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
很好,但是您對這種結構所能做的只是通過單獨的 (或者多維的) 索引來設定和檢索元素。與此相比,Numarray 數組要更靈活:
清單 2. Numerical Python 數組
>>> from numarray import *
>>> numarr = array(pyarr)
>>> print numarr
[[1 2 3]
[4 0 6]
[7 8 9]]
改變並不大,但是使用 Numarray 進行的操作如何呢? 下面是一個例子:
清單 3. 元素操作
>>> numarr2 = numarr * 2
>>> print numarr2
[[ 2 4 6]
[ 8 0 12]
[14 16 18]]
>>> print numarr2 + numarr
[[ 3 6 9]
[12 0 18]
[21 24 27]]