NumPy

NumPy是Python語言的一個擴充程式庫。支援高-{}-階大規模的多維陣列與矩陣運算，此外也針對陣列運算提供大量的數學函式函式庫。NumPy的前身Numeric最早是由Jim Hugunin與其它協作者共同開發，2005年，Travis Oliphant在Numeric中結合了另一個同性質的程式庫Numarray的特色，並加入了其它擴充功能而開發了NumPy。NumPy為開放原始碼並且由許多協作者共同維護開發。歷史.Matrix-sig.儘管很早就受到了科學界和工業界的關注，但Python最初並不是為數值計算設計的。1995年，特殊興趣小組，使陣列計算更容易。Numeric.矩陣包Numeric由Jim Fulton實現，並由Jim Hugunin推廣， (也稱Numerical Python extensions或 NumPy)。Jim Hugunin 是麻省理工學院的研究生，:10 於1997年加入從事JPython的研發，勞倫斯利弗莫爾國家實驗室的Paul Dubois接任維護者。:10其他早期貢獻者包括David Ascher, Konrad Hinsen和Travis Oliphant。:10Numarray.Numarray是作為Numeric的替代品被開發出來的，現已廢棄。相比於Numeric，Numarray處理大陣列速度較快，然而處理小陣列速度較慢，因此有一段時間這兩個包被並行使用於不同情況。Numeric的最後一個版本於2006年8月24日釋出。有人希望將Numeric納入Python標準庫，但吉多·範羅蘇姆認為，在當時的情況下，程式碼難以維護。NumPy.2005年初，NumPy的開發者Travis Oliphant希望社群的不同陣列包可以統一。他將Numarray的功能移植到Numeric上，並於2006將結果作為NumPy 1.0釋出。這個新專案是SciPy的一部分。為了避免在只需陣列計算的情況下安裝龐大的SciPy包，新包以NumPy的名義被分離出來。2011年，NumPy的1.5.0版本加入了對Python 3的支援。2011年，PyPy開始開發NumPy API，但它尚未與NumPy完全相容。特色.NumPy參考CPython，而在這個Python實作直譯器上所寫的數學演演算法程式碼通常遠比編譯過的相同程式碼要來得慢。為瞭解決這個難題，NumPy引入了多維陣列以及可以直接有效率地操作多維陣列的函式與運運算元。因此在NumPy上只要能被表示為針對陣列或矩陣運算的演演算法，其執行效率幾乎都可以與編譯過的等效C語言程式碼一樣快。NumPy提供了與MATLAB相似的功能與操作方式，因為兩者皆為直譯語言，並且都可以讓使用者在針對陣列或矩陣運算時提供較純量運算更快的效能。兩者相較之下，MATLAB提供了大量的擴充工具箱；而NumPy則是根基於Python這個更現代、完整並且開放原始碼的程式語言之上。此外NumPy也可以結合其它的Python擴充函式庫。例如SciPy，這個函式庫提供了更多與MATLAB相似的功能；以及Matplotlib，這是一個與MATLAB內建繪圖功能類似的函式庫。而從本質上來說，NumPy與MATLAB同樣是利用BLAS與LAPACK來提供高效率的線性代數運算。ndarray 資料結構.NumPy的核心功能是ndarray。侷限性.在陣列中插入或追加元素並不像Python的list一樣簡單。實際上建立了新的具有目標形狀和填充值的陣列，將給定陣列的值複製到新陣列中並返回新陣列。並沒有直接連線兩個陣列，而是返回新的陣列，該陣列填充了兩個原陣列的值。用改變陣列的維度只有在陣列中元素數量不變的情況下才能實現。造成以上情況的原因是NumPy的陣列必須佔用連續的記憶體空間。Blaze包嘗試克服這個限制。未經向量化的演算法通常執行緩慢，因為它們必須用純Python方法實現；由於需要建立和輸入等大的臨時陣列，部分操作的向量化可能會增長其空間複雜度避免這一問題。可與NumPy整合的開源解決方案包括 numexpr和Numba。Cython和Pythran是靜態編譯的解決方案。許多現代大型科學計算應用的要求超出了NumPy陣列的能力。例如，NumPy陣列通常載入到計算機的記憶體中，然而記憶體可能沒有足夠的容量；此外，NumPy僅在單個CPU上進行操作，而許多線性代數運算元可以透過CPU的叢集和其它特殊硬體來加速。因此，近期在Python的生態中出現了許多其它工具，例如用於分散式陣列的、用於GPU計算的TensorFlow和JAX等。這些庫通常實現或模仿NumPy的部分API，因此使用者不需大量改動就可以部署原先使用NumPy的程式。近期出現的由Nvidia的CUDA架構加速的庫展示了快速計算的潛力，是NumPy的直接替代品。語法.»&gt; import numpy as np»&gt; x = np.array([1, 2, 3])»&gt; xarray([1, 2, 3])»&gt; y = np.arange(10) # 類似 Python 的 range, 但是回傳 array»&gt; yarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])»&gt; a = np.array([1, 2, 3, 6])»&gt; b = np.linspace(0, 2, 4) # 建立一個array, 在0與2的範圍之間讓4個點3等分»&gt; c = a - b»&gt; carray([ 1. , 1.33333333, 1.66666667, 4. ])»&gt; a**2array([ 1, 4, 9, 36])»&gt; a = np.linspace(-np.pi, np.pi, 100)»&gt; b = np.sin(a)»&gt; c = np.cos(a)»&gt; from numpy.random import rand»&gt; from numpy.linalg import solve, inv»&gt; a = np.array(1, 2, 3], [3, 4, 6.7], [5, 9.0, 5)»&gt; a.transpose()array( 1. , 3. , 5. ],[ 2. , 4. , 9. ],[ 3. , 6.7, 5. )»&gt; inv(a)array(-2.27683616, 0.96045198, 0.07909605],[ 1.04519774, -0.56497175, 0.1299435 ],[ 0.39548023, 0.05649718, -0.11299435)»&gt; b = np.array([3, 2, 1])»&gt; solve(a, b) # 解方程式 ax = barray([-4.83050847, 2.13559322, 1.18644068])»&gt; c = rand(3, 3) # 建立一個 3x3 隨機矩陣»&gt; carray( 3.98732789, 2.47702609, 4.71167924],[ 9.24410671, 5.5240412 , 10.6468792 ],[ 10.38136661, 8.44968437, 15.17639591)»&gt; np.dot(a, c) # 矩陣相乘array( 53.61964114, 38.8741616 , 71.53462537],[ 118.4935668 , 86.14012835, 158.40440712],[ 155.04043289, 104.3499231 , 195.26228855)