NumPy
NumPy是Python語言的一個擴充程式庫。支援高階大規模的多維陣列與矩陣運算,此外也針對陣列運算提供大量的數學函數函式庫。NumPy的前身Numeric最早是由Jim Hugunin與其它協作者共同開發,2005年,Travis Oliphant在Numeric中結合了另一個同性質的程式庫Numarray的特色,並加入了其它擴充功能而開發了NumPy。NumPy為開放原始碼並且由許多協作者共同維護開發。
原作者 | 特拉维斯·奥利芬特 |
---|---|
開發者 | 社群專案 |
首次发布 | Numeric, 1995年 NumPy, 2006年 | ;
当前版本 |
|
源代码库 | |
编程语言 | Python, C語言 |
操作系统 | 跨平台 |
类型 | 数值分析 |
许可协议 | BSD授權條款 |
网站 | www |
历史
Matrix-sig
尽管很早就受到了科学界和工业界的关注,但Python最初并不是为数值计算设计的。1995年,特殊兴趣小组(Special Interest Group,SIG)Matrix-sig成立,其目的是设计一个数组计算包。Matrix-sig的成员中有Python的设计者和维护者吉多·范罗苏姆,他扩展了Python的语法(特别是索引语法[2]),使数组计算更容易。[3]
Numeric
矩阵包Numeric由Jim Fulton实现,并由Jim Hugunin推广[3], (也称Numerical Python extensions或 NumPy)。[4][5]Jim Hugunin 是麻省理工学院的研究生,[5]:10 于1997年加入国家研究计划公司从事JPython的研发[3],劳伦斯利弗莫尔国家实验室的Paul Dubois接任维护者。[5]:10其他早期贡献者包括David Ascher, Konrad Hinsen和Travis Oliphant。[5]:10
特色
NumPy參考CPython(一個使用位元組碼的直譯器),而在這個Python實作直譯器上所寫的數學演算法程式碼通常遠比編譯過的相同程式碼要來得慢。為了解決這個難題,NumPy引入了多維陣列以及可以直接有效率地操作多維陣列的函式與運算子。因此在NumPy上只要能被表示為針對陣列或矩陣運算的演算法,其執行效率幾乎都可以與編譯過的等效C語言程式碼一樣快[15]。
NumPy提供了與MATLAB相似的功能與操作方式,因為兩者皆為直譯語言,並且都可以讓使用者在針對陣列或矩陣運算時提供較純量運算更快的效能。兩者相較之下,MATLAB提供了大量的擴充工具箱(例如Simulink);而NumPy則是根基於Python這個更現代、完整並且開放原始碼的程式語言之上。此外NumPy也可以結合其它的Python擴充函式庫。例如SciPy,這個函式庫提供了更多與MATLAB相似的功能;以及Matplotlib,這是一個與MATLAB內建繪圖功能類似的函式庫。而從本質上來說,NumPy與MATLAB同樣是利用BLAS與LAPACK來提供高效率的線性代數運算。
ndarray 数据結構
NumPy的核心功能是ndarray(即n-dimensional array,多維陣列)数据結構。這是一個表示多維度、同質並且固定大小的陣列物件。而由一個與此陣列相關聯的資料型態物件來描述其陣列元素的資料格式(例如其字元組順序、在記憶體中佔用的字元組數量、整數或者浮點數等等)。
局限性
在数组中插入或追加元素并不像Python的list一样简单。np.pad(...)
实际上创建了新的具有目标形状和填充值的数组,将给定数组的值复制到新数组中并返回新数组。np.concatenate([a1,a2])
并没有直接连接两个数组,而是返回新的数组,该数组填充了两个原数组的值。用np.reshape(...)
改变数组的维度只有在数组中元素数量不变的情况下才能实现。造成以上情况的原因是NumPy的数组必须占用连续的内存空间。Blaze包尝试克服这个限制。[16]
未经矢量化的算法通常运行缓慢,因为它们必须用纯Python方法实现;由于需要创建和输入等大的临时数组,部分操作的矢量化可能会增长其空间复杂度(例如由常数增长到线性)。部分小组通过运行时编译(Runtime compilation of numerical code)避免这一问题。可与NumPy集成的开源解决方案包括 numexpr[17]和Numba[18]。Cython和Pythran是静态编译的解决方案。
许多现代大型科学计算应用的要求超出了NumPy数组的能力。例如,NumPy数组通常加载到计算机的内存中,然而内存可能没有足够的容量;此外,NumPy仅在单个CPU上进行操作,而许多线性代数算子可以通过CPU的集群和其它特殊硬件(例如GPU、TPU,部分深度学习应用也依赖于这些特殊硬件)来加速。因此,近期在Python的生态中出现了许多其它工具,例如用于分布式数组的Dask、用于GPU计算的TensorFlow和JAX等。这些库通常实现或模仿NumPy的部分API,因此用户不需大量改动就可以部署原先使用NumPy的程序。[19]近期出现的由Nvidia的CUDA架构加速的CuPy库[20]展示了快速计算的潜力,是NumPy的直接替代品。[21]
語法
- 格点
>>> import numpy as np
>>> x = np.array([1, 2, 3])
>>> x
array([1, 2, 3])
>>> y = np.arange(10) # 類似 Python 的 range, 但是回傳 array
>>> y
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
- 基本運算
>>> a = np.array([1, 2, 3, 6])
>>> b = np.linspace(0, 2, 4) # 建立一個array, 在0與2的範圍之間讓4個點3等分
>>> c = a - b
>>> c
array([ 1. , 1.33333333, 1.66666667, 4. ])
>>> a**2
array([ 1, 4, 9, 36])
- 全域方法
>>> a = np.linspace(-np.pi, np.pi, 100)
>>> b = np.sin(a)
>>> c = np.cos(a)
- 線性代數
>>> from numpy.random import rand
>>> from numpy.linalg import solve, inv
>>> a = np.array([[1, 2, 3], [3, 4, 6.7], [5, 9.0, 5]])
>>> a.transpose()
array([[ 1. , 3. , 5. ],
[ 2. , 4. , 9. ],
[ 3. , 6.7, 5. ]])
>>> inv(a)
array([[-2.27683616, 0.96045198, 0.07909605],
[ 1.04519774, -0.56497175, 0.1299435 ],
[ 0.39548023, 0.05649718, -0.11299435]])
>>> b = np.array([3, 2, 1])
>>> solve(a, b) # 解方程式 ax = b
array([-4.83050847, 2.13559322, 1.18644068])
>>> c = rand(3, 3) # 建立一個 3x3 隨機矩陣
>>> c
array([[ 3.98732789, 2.47702609, 4.71167924],
[ 9.24410671, 5.5240412 , 10.6468792 ],
[ 10.38136661, 8.44968437, 15.17639591]])
>>> np.dot(a, c) # 矩陣相乘
array([[ 53.61964114, 38.8741616 , 71.53462537],
[ 118.4935668 , 86.14012835, 158.40440712],
[ 155.04043289, 104.3499231 , 195.26228855]])
参考资料
- . [2024年2月7日].
- . numpy.org. [2021-04-06]. (原始内容存档于2023-06-12).
- Millman, K. Jarrod; Aivazis, Michael. . Computing in Science and Engineering. 2011, 13 (2): 9–12 [2014-07-07]. Bibcode:2011CSE....13b...9M. doi:10.1109/MCSE.2011.36. (原始内容存档于2019-02-19).
- Travis Oliphant. (PDF). Computing in Science and Engineering. 2007 [2013-10-12]. (原始内容 (PDF)存档于2013-10-14).
- David Ascher; Paul F. Dubois; Konrad Hinsen; Jim Hugunin; Travis Oliphant. (PDF). 1999 [2023-03-17]. (原始内容存档 (PDF)于2023-03-17).
- van der Walt, Stéfan; Colbert, S. Chris; Varoquaux, Gaël. . Computing in Science and Engineering (IEEE). 2011, 13 (2): 22. Bibcode:2011CSE....13b..22V. S2CID 16907816. arXiv:1102.1523 . doi:10.1109/MCSE.2011.37.
- . [2006-06-24]. (原始内容存档于2021-06-09).
- Travis E. Oliphant. . 7 December 2006 [2 February 2017].
- Travis Oliphant and other SciPy developers. . [2 February 2017]. (原始内容存档于2017-02-03).
- . [2008-03-24]. (原始内容存档于2012-03-02).
- . scipy.github.io. [2023-03-17]. (原始内容存档于2023-03-17).
- . [2011-04-29]. (原始内容存档于2021-12-09).
- . [2011-12-22]. (原始内容存档于2023-03-25).
- . [2013-10-14]. (原始内容存档于2013-10-16).
- . [2006-06-25]. (原始内容存档于2015-01-13).
- . Read the Docs. [17 July 2016].
- Francesc Alted. . GitHub. [8 March 2014]. (原始内容存档于2023-03-24).
- . [8 March 2014]. (原始内容存档于2023-06-01).
- Charles R Harris; K. Jarrod Millman; Stéfan J. van der Walt; et al. (PDF). 自然. 2020-09-16, 585 (7825): 357–362. ISSN 1476-4687. PMC 7759461 . PMID 32939066. arXiv:2006.10256 . doi:10.1038/S41586-020-2649-2. Wikidata Q99413970 (英语)., Wikidata Q99413970
- , [2021-05-11], (原始内容存档于2021-12-21) (英语)
- Entschev, Peter Andreas. . Medium. 2019-07-23 [2021-05-11]. (原始内容存档于2023-03-16) (英语).
扩展阅读
- Bressert, Eli. . O'Reilly Media. 2012. ISBN 978-1-4493-0546-8.
- McKinney, Wes. 2nd. Sebastopol: O'Reilly. 2017. ISBN 978-1-4919-5766-0.
- VanderPlas, Jake. . . O'Reilly. 2016: 33–96. ISBN 978-1-4919-1205-8.