Python數據分析(七):利用數組進行高效的數據處理

編程語言 Python 技術 直男進步大本營 2017-04-05

NumPy數組可以將許多數據處理任務表述為簡潔的數組表達式,否則需要編寫循環。用數組表達式代替循環的做法,通常被稱為矢量化。通常矢量化數組運算要比等價的純Python方式快上一兩個數量級,尤其是各種數值計算。

  • 假設我們想要在一組值(網格型)上計算函數sqrt(x^2 + y^2)。np.meshgrid()函數接受兩個一維數組,併產生兩個二維矩陣,對應於兩個數組中所有的(x, y)對。

  • Python數據分析(七):利用數組進行高效的數據處理

Python數據分析(七):利用數組進行高效的數據處理

將條件邏輯表述為數組運算

  • np.where()函數是三元表達式 x if condition else y的矢量化版本。假設我們有一個布爾數組和兩個值數組:

  • 這有一些問題。第一,它對大數組的處理速度不是很快;第二,無法用於多維數組。若使用np.where(),則可以將該功能寫得非常簡潔。

Python數據分析(七):利用數組進行高效的數據處理

Python數據分析(七):利用數組進行高效的數據處理

Python數據分析(七):利用數組進行高效的數據處理

  • np.where()的第二個和第三個參數不必是數組,也可以是標量值。where()通常用於根據另一個數組產生一個新的數組。

    • np.where()可以表述更加複雜的邏輯。

Python數據分析(七):利用數組進行高效的數據處理

數學和統計方法

sum()對數組中全部或某軸向的元素求和。零長度的數組的sum為0。
mean()算術平均數。零長度的數組的mean為NaN。
std()/var()分別為標準差和方差,自由度可調(默認為n)。
min()/max()最大值和最小值。
argmin()/argmax()分別為最大和最小元素的索引。
cumsum()所有元素的累計和。
cumprod()所有元素的累計積。

用於布爾型數組的方法

  • 在使用基本統計方法時,布爾值會被強制轉換為1和0,因此sum經常被用來對布爾型數據中的True值計數。

  • 另外還有兩個方法any()和all(),它們對布爾型數組非常有用。any()用於測試數組中是否存在一個或多個True,而all()則檢查數組中所有制是否都是True,兩個方法均返回布爾值結果。這兩個方法也可用於非布爾型數組,所有非0元素均會被當作True。

排序

  • 與Python內置的列表類型一樣,NumPy數組也可以通過sort方法就地排序(會對原數組進行操作)。

  • 多維數組可以在任何一個軸向上進行排序,只需將軸編號傳給sort即可。

Python數據分析(七):利用數組進行高效的數據處理

請點擊此處輸入圖片描

Python數據分析(七):利用數組進行高效的數據處理

  • 頂級方法np.sort()返回的是數組的已排序副本,而就地排序則會修改數組本身。計算數組分位數最簡單的方法是對其進行排序,然後取特定位置的值:

  • Python數據分析(七):利用數組進行高效的數據處理

唯一化以及其他的集合邏輯。

  • NumPy提供了一些針對一維ndarray()的基本集合運算,最常用的可能要數np.unique()了,它用於找出數組中的唯一值並返回已排序的結果。

  • 拿跟np.unique()等價的純Python代碼對比一下:

Python數據分析(七):利用數組進行高效的數據處理

Python數據分析(七):利用數組進行高效的數據處理

Python數據分析(七):利用數組進行高效的數據處理

  • 另一個函數np.in1d()用於測試一個數組中的值在另一個數組中的成員資格,返回一個布爾型數組:

unique(x)計算x中的唯一元素,並返回有序結果
intersect1d(x, y)計算x和y的交集,並返回有序結果
union1d(x, y)計算x和y的並集,並返回有序結果
in1d(x, y)得到一個表示“x的元素是否包含於y”的布爾型數組
setdiff1d(x, y)集合的差,即元素在x中且不在y中
setxor1d(x, y)集合的對稱差,即存在於一個數組中但不同時存在於兩個數組中的元素。

相關推薦

推薦中...