Numpy 中文用戶指南 1. 安裝

譯者:飛龍

1.1 NumPy 是什么?

原文:What is NumPy?

NumPy是Python中用于科學(xué)計算的基礎(chǔ)包。它是一個Python庫,提供多維數(shù)組對象,各種派生的對象(如掩碼數(shù)組和矩陣),以及數(shù)組快速操作的各種各樣的例程,包括數(shù)學(xué)、邏輯、圖形操作,排序、選擇、I/O、離散傅里葉變換、基本線性代數(shù)、基本統(tǒng)計操作,隨機(jī)模擬以及其他。

NumPy包的核心是ndarray對象。它封裝了均勻數(shù)據(jù)類型的n維數(shù)組,帶有一些在編譯過的代碼中執(zhí)行的操作。NumPy數(shù)組和Python標(biāo)準(zhǔn)列表有一些重要的差異:

  • NumPy數(shù)組在創(chuàng)建時有固定的大小,不像Python列表(可動態(tài)增長)。改變一個ndarray的大小將創(chuàng)建一個新數(shù)組,并刪除原有數(shù)組。
  • NumPy數(shù)組中的元素都必須是相同的數(shù)據(jù)類型,從而具有相同的內(nèi)存大小。但有個例外:(Python,包括NumPy)對象數(shù)組的元素大小是不同的。
  • NumPy數(shù)組使大量數(shù)據(jù)上的高級數(shù)學(xué)運(yùn)算和其他類型的操作變得容易。通常情況下,這樣的操作可能比使用Python的內(nèi)置列表效率更高,執(zhí)行的代碼更少。
  • 越來越多的基于Python的科學(xué)和數(shù)學(xué)包使用NumPy數(shù)組;雖然它們通常支持Python列表作為輸入,但他們會在處理之前將這些輸入轉(zhuǎn)換為NumPy數(shù)組,并總是輸出NumPy數(shù)組。換句話說,為了高效使用許多(也許甚至是大多數(shù))當(dāng)今基于Python的科學(xué)/數(shù)學(xué)軟件,只要知道如何使用Python的內(nèi)置列表類型是不夠的————你還需要知道如何使用NumPy數(shù)組。

序列大小和速度在科學(xué)計算中尤為重要。例如考慮兩個長度相同的列表中每個元素相乘的情況。如果數(shù)據(jù)被存儲在兩個Python列表 a 和 b 中,我們可以這樣遍歷每個元素:

c = []
for i in range(len(a)):
    c.append(a[i]*b[i])

這就產(chǎn)生了正確的答案,但如果 a 和 b 都含有數(shù)以百萬計的數(shù)字,我們將為Python的低效循環(huán)付出代價。我們可以這樣以C語言編寫代碼來完成同樣的任務(wù)(為清楚起見我們忽略變量聲明和初始化、內(nèi)存分配等):

for (i = 0; i < rows; i++): {
  c[i] = a[i]*b[i];
}

這節(jié)省了所有涉及解釋Python代碼和操作Python對象的開銷,但沒有了使用Python編碼的優(yōu)勢。此外,編碼所需的工作量隨數(shù)據(jù)維數(shù)的增加而增加。例如對于一個二維數(shù)組,C代碼(像上面一樣簡寫)會擴(kuò)展為:

for (i = 0; i < rows; i++): {
  for (j = 0; j < columns; j++): {
    c[i][j] = a[i][j]*b[i][j];
  }
}

NumPy綜合了兩種情況的優(yōu)點(diǎn):元素級別的操作是ndarray的“默認(rèn)模式”,而它又通過執(zhí)行預(yù)編譯的C代碼來加速。在NumPy中:

c = a * b

的行為像之前的例子一樣,幾近于C語言的速度,但是代碼正如我們期望中的那樣,就像標(biāo)準(zhǔn)的Python一樣簡潔。實際上,NumPy的風(fēng)格還能更簡潔!最后這個例子說明了NumPy的兩個特性:向量化(Vectorization)和廣播(Broadcasting),它們是NumPy強(qiáng)大之處的基礎(chǔ)。

向量化用于描述任何缺失的顯式循環(huán)、索引及其它,在代碼這些事情是即時發(fā)生的,當(dāng)然,是在“幕后”(預(yù)編譯的C代碼中)優(yōu)化。向量化編碼的優(yōu)點(diǎn)很多,比如:

  • 向量化的代碼更簡潔易讀
  • 代碼更少一般意味著更少的錯誤
  • 代碼更像標(biāo)準(zhǔn)的數(shù)學(xué)符號(通常情況下,更容易編寫數(shù)學(xué)結(jié)構(gòu))
  • 向量化的結(jié)果更加“Pythonic”。沒有向量化,我們的代碼會更加低效,循環(huán)也難以閱讀。

廣播是描述隱式的元素級操作的術(shù)語;一般來說,NumPy中所有操作,并不只是算術(shù)運(yùn)算,還有邏輯運(yùn)算,位運(yùn)算,函數(shù)運(yùn)算等,以這種隱式的元素層面的方式執(zhí)行,就是廣播。此外,在上面的例子中,a 和 b 可以是相同形狀的多維數(shù)組,或者一個標(biāo)量和一個數(shù)組;甚至可以是不同的形狀的2個數(shù)組,假設(shè)較小的數(shù)組可以以產(chǎn)生明確廣播的方式,擴(kuò)展為較大數(shù)組的尺寸。詳細(xì)規(guī)則見 numpy.doc.broadcasting。

NumPy完全支持ndarray的面向?qū)ο?。例如,ndarray是一個類,擁有許多方法和屬性。它的許多方法復(fù)制了NumPy最外層命名空間的函數(shù),讓程序員完全自由決定代碼寫成哪個范式,以及哪個范式更適合當(dāng)前的任務(wù)。

1.2 安裝 NumPy

原文:Installing NumPy

大多數(shù)情況下,在系統(tǒng)上安裝NumPy的最好辦法是使用為你的操作系統(tǒng)預(yù)編譯的包。

一些可選的連接請見 http://scipy.org/install.html

有關(guān)源碼包構(gòu)建的說明,請見從源碼中構(gòu)建。這些信息主要用于高級用戶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容