###### 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])
```