NumPy數組可以將許多數據處理任務表述為簡潔的數組表達式,否則需要編寫循環。用數組表達式代替循環的做法,通常被稱為矢量化。通常矢量化數組運算要比等價的純Python方式快上一兩個數量級,尤其是各種數值計算。
假設我們想要在一組值(網格型)上計算函數sqrt(x^2 + y^2)。np.meshgrid()函數接受兩個一維數組,併產生兩個二維矩陣,對應於兩個數組中所有的(x, y)對。
將條件邏輯表述為數組運算
np.where()函數是三元表達式 x if condition else y的矢量化版本。假設我們有一個布爾數組和兩個值數組:
這有一些問題。第一,它對大數組的處理速度不是很快;第二,無法用於多維數組。若使用np.where(),則可以將該功能寫得非常簡潔。
np.where()的第二個和第三個參數不必是數組,也可以是標量值。where()通常用於根據另一個數組產生一個新的數組。
np.where()可以表述更加複雜的邏輯。
數學和統計方法
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即可。
頂級方法np.sort()返回的是數組的已排序副本,而就地排序則會修改數組本身。計算數組分位數最簡單的方法是對其進行排序,然後取特定位置的值:
唯一化以及其他的集合邏輯。
NumPy提供了一些針對一維ndarray()的基本集合運算,最常用的可能要數np.unique()了,它用於找出數組中的唯一值並返回已排序的結果。
拿跟np.unique()等價的純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) | 集合的對稱差,即存在於一個數組中但不同時存在於兩個數組中的元素。 |