###### tags: `numpy` # NumPy 學習筆記 ## 循單一軸進行陣列運算 建立一個 2×2×2 的陣列如下: ```python= >>> a = np.array( [[[1,8],[2,7]],[[3,6],[4,5]]]) ``` 可以畫成以下的圖, 其中 D~n~ 表示第 n 軸的維度: ||D~0~=1|D~2~=0|D~2~=1| |----|----|-----|----| ||**D~1~=0**|3|6| ||**D~1~=1**|4|5| |**D~0~=0**|**D~2~=0**|**D~2~=1**|| |**D~1~=0**|1|8|| |**D~1~=1**|2|7|| 以下表示找出陣列中所有元素的最大值: ```python= >>> np.max(a) 8 ``` 以下則是表示依循第 0 軸找出最大值構成的陣列: ```python= >>> np.max(a, axis=0) array([[3, 8], [4, 7]]) ``` 光看結果不容易瞭解意思, 就是要找出其他軸固定維度下, 第 0 軸的最大值, 並以找出的最大值形成新的陣列。以剛剛的例子來說, 等於: 1. 第 1 和 2 軸先固定在維度 0, 找出第 0 軸的最大值: ||D~0~=1|D~2~=0**↓**|D~2~=1| |----|----|-----|----| ||**D~1~=0→**|**3**|6| ||**D~1~=1**|4|5| |**D~0~=0**|**D~2~=0↓**|**D~2~=1**|| |**D~1~=0→**|**1**|8|| |**D~1~=1**|2|7|| 這時第 0 軸的最大值就是 3 和 1 中的 3。 1. 第 1 軸維度維持 0、第 2 軸維度加 1變成 1, 找出第 0 軸的最大值: ||D~0~=1|D~2~=0|D~2~=1**↓**| |----|----|-----|----| ||**D~1~=0→**|3|**6**| ||**D~1~=1**|4|5| |**D~0~=0**|**D~2~=0**|**D~2~=1↓**|| |**D~1~=0→**|1|**8**|| |**D~1~=1**|2|7|| 這時第 0 軸的最大值就是 6 和 8 中的 8。到這裡第 2 軸已經結束, 將剛剛找出的兩個最大值變成 1 個 1 軸陣列: ```python [3, 8] ``` 1. 接著第 2 軸回復到維度 0, 第 1 軸往下到維度 1, 找出第 0 軸的最大值: ||D~0~=1|D~2~=0**↓**|D~2~=1| |----|----|-----|----| ||**D~1~=0**|3|6| ||**D~1~=1→**|**4**|5| |**D~0~=0**|**D~2~=0↓**|**D~2~=1**|| |**D~1~=0**|1|8|| |**D~1~=1→**|**2**|7|| 這時第 0 軸的最大值就是 4 和 2 中的 4。 1. 最後第 1 軸維度維持 1、第 2 軸維度加 1 變成 1, 找出第 0 軸的最大值: ||D~0~=1|D~2~=0|D~2~=1**↓**| |----|----|-----|----| ||**D~1~=0**|3|6| ||**D~1~=1→**|4|**5**| |**D~0~=0**|**D~2~=0**|**D~2~=1↓**|| |**D~1~=0**|1|8|| |**D~1~=1→**|2|**7**|| 這時第 0 軸的最大值就是 5 和 7 中的 7。到這裡第 2 軸已經結束, 將剛剛找出的兩個最大值變成另 1 個 1 軸陣列: ```python [4, 7] ``` 1. 由於第一軸也到底了, 將剛剛完成的兩個陣列再拼成多一軸的陣列, 結果就是 ```python [ [3, 8], [4, 7] ] ``` 您也可以依照上述方法找出循第 1 軸的結果: ```python= >>> np.max(a, axis=1) array([[2, 8], [4, 6]]) ``` 過程如下: 1. 第 0 軸維度 0、第 2 軸維度 0, 最大值為 2: ||D~0~=1|D~2~=0|D~2~=1| |----|----|-----|----| ||**D~1~=0**|3|6| ||**D~1~=1**|4|5| |**D~0~=0↘**|**D~2~=0↓**|**D~2~=1**|| |**D~1~=0**|**1**|8|| |**D~1~=1**|**2**|7|| 1. 第 0 軸維度 0、第 2 軸維度 1, 最大值為 8: ||D~0~=1|D~2~=0|D~2~=1| |----|----|-----|----| ||**D~1~=0**|3|6| ||**D~1~=1**|4|5| |**D~0~=0↘**|**D~2~=0**|**D~2~=1↓**|| |**D~1~=0**|1|**8**|| |**D~1~=1**|2|**7**|| 最後一軸已經到底, 剛剛的最大值組成陣列: ```python [2, 8] ``` 1. 第 0 軸維度 1、第 2 軸維度 0, 最大值為 4: ||D~0~=1↘|D~2~=0**↓**|D~2~=1| |----|----|-----|----| ||**D~1~=0**|**3**|6| ||**D~1~=1**|**4**|5| |**D~0~=0**|**D~2~=0**|**D~2~=1**|| |**D~1~=0**|1|8|| |**D~1~=1**|2|7|| 1. 第 0 軸維度 1、第 2 軸維度 1, 最大值為 6: ||D~0~=1↘|D~2~=0|D~2~=1↓| |----|----|-----|----| ||**D~1~=0**|3|**6**| ||**D~1~=1**|4|**5**| |**D~0~=0**|**D~2~=0**|**D~2~=1**|| |**D~1~=0**|1|8|| |**D~1~=1**|2|7|| 最後一軸已經到底, 剛剛的最大值組成陣列: ```python [4, 6] ``` 1. 由於第 0 軸也到底了, 所以就把剛剛完成的兩個陣列再拼成多一軸的陣列, 結果就是 ```python [ [2, 8], [4, 6] ] ``` 循第 2 軸的結果: ```python= >>> np.max(a, axis=2) array([[8, 7], [6, 5]]) ``` 過程如下: 1. 第 0 軸維度 0、第 1 軸維度 0, 最大值為 8: ||D~0~=1|D~2~=0|D~2~=1| |----|----|-----|----| ||**D~1~=0**|3|6| ||**D~1~=1**|4|5| |**D~0~=0↘**|**D~2~=0**|**D~2~=1**|| |**D~1~=0→**|**1**|**8**|| |**D~1~=1**|2|7|| 1. 第 0 軸維度 0、第 1 軸維度 1, 最大值為 7: ||D~0~=1|D~2~=0|D~2~=1| |----|----|-----|----| ||**D~1~=0**|3|6| ||**D~1~=1**|4|5| |**D~0~=0↘**|**D~2~=0**|**D~2~=1**|| |**D~1~=0**|1|8|| |**D~1~=1→**|**2**|**7**|| 最後一軸已經到底, 剛剛的最大值組成陣列: ```python [8, 7] ``` 1. 第 0 軸維度 1、第 1 軸維度 0, 最大值為 6: ||D~0~=1↘|D~2~=0|D~2~=1| |----|----|-----|----| ||**D~1~=0→**|**3**|**6**| ||**D~1~=1**|4|5| |**D~0~=0**|**D~2~=0**|**D~2~=1**|| |**D~1~=0**|1|8|| |**D~1~=1**|2|7|| 1. 第 0 軸維度 1、第 1 軸維度 1, 最大值為 5: ||D~0~=1↘|D~2~=0|D~2~=1| |----|----|-----|----| ||**D~1~=0**|3|6| ||**D~1~=1→**|**4**|**5**| |**D~0~=0**|**D~2~=0**|**D~2~=1**|| |**D~1~=0**|1|8|| |**D~1~=1**|2|7|| 最後一軸已經到底, 剛剛的最大值組成陣列: ```python [6, 5] ``` 1. 由於第 0 軸也到底了, 所以就把剛剛完成的兩個陣列再拼成多一軸的陣列, 結果就是 ```python [ [8, 7], [6, 5] ] ``` ## 循多個軸計算 既然可以循單一軸, 當然也可以循多軸, 例如以下表示循第 0 和 1 兩軸計算: ```python= >>> np.max(a, axis=(0, 1)) array([4, 8]) ``` 這個結果怎麼來的呢?依照剛剛的想法, 就依照步驟固定剩下的軸找出最大值即可, 這裡因為只剩下第 2 軸, 所以步驟如下: 1. 第 2 軸維度先固定在 0: ||D~0~=1|D~2~=0↓|D~2~=1| |----|----|-----|----| ||**D~1~=0**|**3**|6| ||**D~1~=1**|**4**|5| |**D~0~=0**|**D~2~=0↓**|**D~2~=1**|| |**D~1~=0**|**1**|8|| |**D~1~=1**|**2**|7|| 最大值就是 3、4、1、2 中的 4。 1. 第 2 軸維度移到 1: ||D~0~=1|D~2~=0|D~2~=1↓| |----|----|-----|----| ||**D~1~=0**|3|**6**| ||**D~1~=1**|4|**5**| |**D~0~=0**|**D~2~=0**|**D~2~=1↓**|| |**D~1~=0**|1|**8**|| |**D~1~=1**|2|**7**|| 最大值就是 6、5、8、7 中的 8。 這一軸已經到底, 剛剛的最大值組成陣列: ```python [4, 8] ``` 1. 由於沒有其他軸了, 所以結果就是剛剛的陣列, 不會再增加軸了。 你也可以把它視為先循第 1 軸計算後, 再針對計算結果的第 0 軸重新進行計算: ```python= >>> np.max(np.max(a, axis=1), axis=0) array([4, 8]) ```