---
# System prepended metadata

title: NumPy 學習筆記
tags: [numpy]

---

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