python中numpy是什么_什么是NumPy?
本文是對官方文檔的翻譯,原文在此What is NumPy? - NumPy v1.14 Manual?docs.scipy.org
以下開始正文。
NumPy是Python的一個用于科學計算的基礎包。它提供了多維數組對象,多種衍生的對象(例如隱藏數組和矩陣)和一個用于數組快速運算的混合的程序,包括數學,邏輯,排序,選擇,I/O,離散傅立葉變換,基礎線性代數,基礎統計操作,隨機模擬等等。
NumPy包的核心是ndarray對象。它封裝了n維同類數組。很多運算是由編譯過的代碼來執行的,以此來提高效率。NumPy數組和標準Python序列有以下幾點重大區別:NumPy數組創建的時候有一個固定的大小,不像Python列表可以動態地增加要素。改變一個ndarray的大小會創建一個新的數組并刪除原數組。
NumPy數組中的要素必須是同一個數據類型,從而在內存中是同樣的大小。唯一例外是可以由Python(包括NumPy)對象作為要素組成數組,因此允許有要素大小不同的數組的存在。
NumPy數組更有利于大規模數據的高級數學運算。通常來說,這些運算執行更高效,并且代碼量比用Python自帶的序列來實現更少。
越來越多的科學和數學Python包使用NumPy數組;雖然這些包通常支持Python序列輸入,但它們通常在處理前把輸入轉化為NumPy數組。換據話說,想要高效地使用當今很多(甚至是大部分)基于Python的科學或數學計算軟件,只是了解如何使用Python內置的序列類型已經不夠了,你必須知道如何使用NumPy數組。
序列大小和速度在科學計算中尤其重要。舉個簡單例子,例如對一個1維數組上的每一個要素乘以另一個同樣長度的數組上對應位置上的要素,如果數據存儲在兩個Python列表a和b中,我們可以對每個要素迭代:
c = []
for i in range(len(a)):
c.append(a[i]*b[i])
這能產生正確的結果,但如果a和b都包含上百萬個要素,Python循環的低效就會帶來問題。我們可以用C語言更快速地完成同樣的任務(先聲明,這里省略了變量聲明和初始化,內存分配等等),如下:
for (i = 0; i < rows; i++):{
c[i] = a[i]*b[i];
}
這里節省了包括解析Python代碼和操作Python對象的消耗,但是也失去了使用Python編程的好處。更進一步講,編程工作量會隨著數據維度的增加而增加。例如,對于2D數組,C代碼要擴展成這樣:
for (i = 0; i < rows; i++): {
for (j = 0; j < columns; j++): {
c[i][j] = a[i][j]*b[i][j];
}
}
NumPy則同時有這兩種方式的最好處:如果涉及到ndarray,逐個要素的運算是“默認的模式”,但同時逐個要素的計算是由預先編譯好的C代碼高效執行的。用NumPy
c = a * b
用接近C語言的速度完成了我們前面的例子做的相同事情,并且保留了我們期待的Python語言的簡潔性。事實上NumPy語法比Python更加簡潔!以上這個例子揭示了NumPy的兩個特性:矢量化(vectorization)和廣播機制(broadcasting)。
矢量化解釋了為什么不需要顯式地循環,索引等等操作。當然這些操作只是在背后用優化過的編譯好的C語言完成了。矢量化的代碼有很多好處,包括:矢量化的代碼更加簡潔和易讀
更少的代碼通常意味著更少錯誤
代碼更類似標準數學符號(使得編寫數學結構更加簡單)
矢量化使得代碼更具Python風格。如果沒有矢量化,代碼里會充斥著低效和難讀的for循環。
廣播機制是指暗含的逐個要素進行的運算;通常而言,在NumPy中,不只是算術運算,包括邏輯,位操作,函數等等所有運算都暗含這種機制。而且,在上面的例子中,a和b可以是兩個相同形狀的多維數組,或者一個向量和一個數組,甚至兩個不同形狀的數組,前提是較小的數組可以以一種明確的方式擴展成跟較大的數組一樣的形狀。更具體的規則,參見這篇文章。Broadcasting - NumPy v1.14 Manual?docs.scipy.org
NumPy的ndarray完全支持面向對象的方式。例如,ndarray是一個類,擁有大量的方法和屬性。它的很多方法復制了NumPy最外層的命名空間的函數,給程序員完全的自由去選擇自己喜歡或者適合手頭任務的方式來寫代碼。
總結
以上是生活随笔為你收集整理的python中numpy是什么_什么是NumPy?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10万存定期还是买理财?怎么选更划算
- 下一篇: python企业微信回调_回调模式