Python中NumPy,SciPy,Pandas這些庫(kù)的區(qū)別?
NumPy發(fā)展史:NumPy的歷史可以追溯到90年代中期,它的前身為Numeric(用C語(yǔ)言編寫(xiě),主要用來(lái)調(diào)取C++中應(yīng)用)和Numarray(用于處理高維數(shù)組,可靈活的索引、數(shù)據(jù)類型變換、廣播等),2005年出現(xiàn)的NumPy作為繼承者,吸取了Numeric中豐富的C API及Numarray的高維數(shù)組處理能力,成為Python科學(xué)計(jì)算生態(tài)系統(tǒng)的基礎(chǔ)。
NumPy的部分功能如下:
摘自《Python for Data Analysis》
ndarray,一個(gè)具有矢量算術(shù)運(yùn)算和復(fù)雜廣播能力的快速且節(jié)省空間的多維數(shù)組。 用于對(duì)整組數(shù)據(jù)進(jìn)行快速運(yùn)算的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)(無(wú)需編寫(xiě)循環(huán))。 用于讀寫(xiě)磁盤(pán)數(shù)據(jù)的工具以及用于操作內(nèi)存映射文件的工具。 線性代數(shù)、隨機(jī)數(shù)生成以及傅里葉變換功能。 用于集成由C、C++、Fortran等語(yǔ)言編寫(xiě)的代碼的A C API。 由于NumPy提供了一個(gè)簡(jiǎn)單易用的C API,因此很容易將數(shù)據(jù)傳遞給由低級(jí)語(yǔ)言編寫(xiě)的外部庫(kù),外部庫(kù)也能以NumPy數(shù)組的形式將數(shù)據(jù)返回給Python。這個(gè)功能使Python成為一種包裝C/C++/Fortran歷史代碼庫(kù)的選擇,并使被包裝庫(kù)擁有一個(gè)動(dòng)態(tài)的、易用的接口。
NumPy本身并沒(méi)有提供多么高級(jí)的數(shù)據(jù)分析功能,理解NumPy數(shù)組以及面向數(shù)組的計(jì)算將有助于你更加高效地使用依賴NumPy的Python科學(xué)計(jì)算庫(kù),如Biopython、SciPy、statsmodels、scikit-learn、Pandas等等。
NumPy之于數(shù)值計(jì)算特別重要的原因之一,是因?yàn)樗梢愿咝幚?strong>大數(shù)組的數(shù)據(jù), 這是因?yàn)椋?/p>
摘自《Python for Data Analysis》
NumPy是在一個(gè)連續(xù)的內(nèi)存塊中存儲(chǔ)數(shù)據(jù),獨(dú)立于其他Python內(nèi)置對(duì)象。 NumPy的C語(yǔ)言編寫(xiě)的算法庫(kù)可以操作內(nèi)存,而不必進(jìn)行類型檢查或其它前期 工作。比起Python的內(nèi)置序列,NumPy數(shù)組使用的內(nèi)存更少。 NumPy可以在整個(gè)數(shù)組上執(zhí)行復(fù)雜的計(jì)算,而不需要Python的for循環(huán)。
實(shí)例證實(shí)NumPy的高效:
以下來(lái)自文獻(xiàn)
2、NumPy數(shù)組ndarray

a, The NumPy array data structure and its associated metadata fields. -數(shù)組結(jié)構(gòu):數(shù)據(jù)、數(shù)據(jù)類型、維度、內(nèi)存中向前移動(dòng)的字節(jié)數(shù) b, Indexing an array with slices and steps. These operations return a ‘view’ of the original data. -數(shù)組索引 c, Indexing an array with masks, scalar coordinates or other arrays, so that it returns a ‘copy’ of the original data. In the bottom example, an array is indexed with other arrays; this broadcasts the indexing arguments before performing the lookup. 使用其他數(shù)組索引數(shù)組 d, Vectorization efficiently applies operations to groups of elements.-數(shù)組矢量化 e, Broadcasting in the multiplication of two-dimensional arrays. -數(shù)組廣播 f, Reduction operations act along one or more axes. In this example, an array is summed along select axes to produce a vector, or along two axes consecutively to produce a scalar. -數(shù)組按行按列運(yùn)算 g, Example NumPy code, illustrating some of these concepts. -以上概念的example
3、哪些Python科學(xué)計(jì)算生態(tài)系統(tǒng)依賴NumPy?
下圖非常清晰,NumPy在生物學(xué)(Biopython)、物理、化學(xué)、天文學(xué)、地球科學(xué)、心理學(xué)、材料科學(xué)、工程學(xué)、金融和經(jīng)濟(jì)學(xué)等領(lǐng)域的研究分析中都起著至關(guān)重要的作用。

4、深度學(xué)習(xí)和人工智能時(shí)代NumPy如何突圍?
NumPy 在 CPU 上性能超級(jí)nice,接近編譯語(yǔ)言【如像C/C++等】; 但是,隨著深度學(xué)習(xí)和人工智能的出現(xiàn),加速需求催生了專用加速器硬件【如 GPU、TPU 和 FPGA】,由于 NumPy 具有的內(nèi)存內(nèi)數(shù)據(jù)模型,它無(wú)法直接使用這類存儲(chǔ)和專用硬件。 NumPy社區(qū)為了應(yīng)對(duì)挑戰(zhàn),開(kāi)發(fā)出了NumPy array protocols,包含諸多函數(shù)【如 Dask、CuPy、PyData/Sparse等】以協(xié)調(diào)外部數(shù)組對(duì)象對(duì)NumPy的調(diào)用。

5、NumPy的下一個(gè)十年
新的設(shè)備將被開(kāi)發(fā)出來(lái),現(xiàn)有的專用硬件也不斷發(fā)展,NumPy如何兼容? 科學(xué)數(shù)據(jù)規(guī)模將繼續(xù)擴(kuò)大; 新一代語(yǔ)言,如Rust、Julia和LLVM、解釋器和編譯器,將創(chuàng)造新的概念和數(shù)據(jù)結(jié)構(gòu)。
參考資料
https://www.nature.com/articles/s41586-020-2649-2
Harris CR, Millman KJ, van der Walt SJ, et al. Array programming with NumPy. Nature. 2020;585(7825):357-362. doi:10.1038/s41586-020-2649-2
