1、數組值求和
先來看一個小例子, 設想計算一個數組中所有元素的和。 Python 本身可用內置的 sum 函數來實現:
In[1]: import numpy as np
In[2]: L = np.random.random(100)
sum(L)
Out[2]: 55.61209116604941
它的語法和 NumPy 的 sum 函數非常相似, 並且在這個簡單的例子中的結果也是一樣的:
In[3]: np.sum(L)
Out[3]: 55.612091166049424
但是, 因爲 NumPy 的 sum 函數在編譯碼中執行操作, 所以 NumPy 的操作計算得更快一些:
In[4]: big_array = np.random.rand(1000000)
%timeit sum(big_array)
%timeit np.sum(big_array)
10 loops, best of 3: 104 ms per loop
1000 loops, best of 3: 442 μs per loop
但是需要注意, sum 函數和 np.sum 函數並不等同, 這有時會導致混淆。 尤其是它們各自的可選參數都有不同的含義, np.sum 函數是知道數組的維度的。
2、最大值、最小值
同樣, Python 也有內置的 min 函數和 max 函數, 分別被用於獲取給定數組的最小值和最大值:
In[5]: min(big_array), max(big_array)
Out[5]: (1.1717128136634614e-06, 0.9999976784968716)
NumPy 對應的函數也有類似的語法, 並且也執行得更快:
In[6]: np.min(big_array), np.max(big_array)
Out[6]: (1.1717128136634614e-06, 0.9999976784968716)
In[7]: %timeit min(big_array)
%timeit np.min(big_array)
10 loops, best of 3: 82.3 ms per loop
1000 loops, best of 3: 497 μs per loop
對於 min、 max、 sum 和其他 NumPy 聚合, 一種更簡潔的語法形式是數組對象直接調用這些方法:
In[8]: print(big_array.min(), big_array.max(), big_array.sum())
1.17171281366e-06 0.999997678497 499911.628197
當你操作 NumPy 數組時, 確保你執行的是 NumPy 版本的聚合。
(1)多維度聚合
一種常用的聚合操作是沿着一行或一列聚合。 例如, 假設你有一些
數據存儲在二維數組中:
In[9]: M = np.random.random((3, 4))
print(M)
[[ 0.8967576 0.03783739 0.75952519 0.06682827]
[ 0.8354065 0.99196818 0.19544769 0.43447084]
[ 0.66859307 0.15038721 0.37911423 0.6687194]]
默認情況下, 每一個 NumPy 聚合函數將會返回對整個數組的聚合
結果:
In[10]: M.sum()
Out[10]: 6.0850555667307118
聚合函數還有一個參數, 用於指定沿着哪個軸的方向進行聚合。 例如, 可以通過指定 axis=0 找到每一列的最小值:
In[11]: M.min(axis=0)
Out[11]: array([ 0.66859307, 0.03783739, 0.19544769, 0.06682827])
這個函數返回四個值, 對應四列數字的計算值。 同樣, 也可以找到每一行的最大值:
In[12]: M.max(axis=1)
Out[12]: array([ 0.8967576 , 0.99196818, 0.6687194])
其他語言的用戶會對軸的指定方式比較困惑。 axis 關鍵字指定的是數組將會被摺疊的維度, 而不是將要返回的維度。 因此指定
axis=0 意味着第一個軸將要被摺疊——對於二維數組, 這意味着每一列的值都將被聚合。
(2)其他聚合函數
NumPy 提供了很多其他聚合函數, 但是這裏不會詳細地介紹它們。 另外, 大多數的聚合都有對 NaN 值的安全處理策略(NaNsafe) , 即計算時忽略所有的缺失值, 這些缺失值即特殊的 IEEE浮點型 NaN 值(關於缺失值更全面的介紹請參見 3.5 節) 。 有些NaN-safe 的函數直到 NumPy 1.8 版本才加進去, 所以更早版本的NumPy 並不支持此功能。
NumPy中可用的聚合函數
函數名稱 | NaN安全版本 | 描述 |
np.sum | np.nansum | 計算元素的和 |
np.prod | np.nanprod | 計算元素的積 |
np.mean | np.nanmean | 計算元素的平均值 |
np.std | np.nanstd | 計算元素的標準差 |
np.var | np.nanvar | 計算元素的方差 |
np.min | np.nanmin | 找出最小值 |
np.max | np.nanmax | 找出最大值 |
np.argmin | np.nanargmin | 找出最小值的索引 |
np.argmax | np.nanargmax | 找出最大值的索引 |
np.median | np.nanmedian | 計算元素的中位數 |
np.percentile | np.nanpercentile | 計算基於元素排序的統計值 |
np.any | N/A | 驗證任何一個元素是否爲真 |
np.all | N/A | 驗證所有元素是否爲真 |