TUTORIAL
NumPy 陣列追加
本節介紹了 NumPy 陣列追加的方法以及注意點
本頁內容
NumPy 提供 numpy.append,可將值加入陣列。它是函式,不是 ndarray.append 方法;它會回傳新陣列,不會就地修改輸入陣列。Python 列表也有名稱相近的方法:list.append 會將一個物件作為單一項目加入,list.extend 則會加入可迭代物件中的每個項目。NumPy 的函式遵循陣列形狀與軸的規則,因此列表操作適合作為比較,兩者並不能互換使用。
numpy.append 的作用
numpy.append 會將輸入陣列與指定的值合併,並回傳合併後的結果。預設情況下,它會先將兩個輸入展平成一維,因此即使原始陣列有多個維度,結果仍是一維陣列。指定軸後,其他維度會保留下來,並沿著指定方向合併。若要建立一維序列,請使用預設行為;若列與欄的排列方式很重要,則請指定軸。
由於這個函式會回傳新陣列,若要使用合併結果,請保留其回傳值。例如,將結果指派給新變數,或重新指派給原變數。如果呼叫函式後沒有使用回傳值,arr 就不會更新。
語法與參數
函式簽章為 numpy.append(arr, values, axis=None)(將 NumPy 匯入為 np 後,通常會以 np.append 呼叫)。arr 是要擴充的類陣列輸入。values 是要加入的資料,可以是純量或類陣列物件。axis 用來選擇合併的維度;預設值 None 會先將兩個輸入展平再合併。函式會回傳一個陣列。
| 參數 | 意義 |
|---|---|
arr |
輸入的類陣列物件。 |
values |
要加入的純量或類陣列值。 |
axis |
合併所沿用的維度;設為 None 時會先展平。 |
執行以下範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import numpy as np
numbers = np.array([1, 2, 3])
combined = np.append(numbers, [4, 5])
print(combined)
[1 2 3 4 5]
不指定軸進行追加
省略 axis 或將它設為 None 時,NumPy 會先將 arr 和 values 展平,再進行合併。無論輸入原本有多少維度,結果都是一維陣列。例如,可以將二維陣列與一列值合併,而不保留原本的列與欄排列。這種行為適合建立一維序列,但不會在原有排列中插入一列或一欄。
若要保留陣列的維度,請指定軸,不要依賴預設行為。展平會在合併值之前捨棄輸入的維度,因此不同形狀的輸入也可能因此能夠合併。
沿著指定軸追加
對二維陣列而言,axis=0 會新增列,axis=1 會新增欄。除了合併方向所指定的維度外,輸入形狀的其他維度都必須相符。因此,新增一列時,其欄數必須與原陣列相同;新增一欄時,其列數必須相同。如果形狀不符,陣列就無法在其他維度保持對齊的情況下合併,因此會引發 ValueError。
以下範例會新增一列:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import numpy as np
matrix = np.array([[1, 2], [3, 4]])
with_row = np.append(matrix, [[5, 6]], axis=0)
print(with_row)
[[1 2]
[3 4]
[5 6]]
除了 axis 指定的維度外,其他維度都必須相符。例如,將有三欄的一列追加至只有兩欄的矩陣並不相容,會引發 ValueError:
import numpy as np
matrix = np.array([[1, 2], [3, 4]])
try:
np.append(matrix, [[5, 6, 7]], axis=0)
except ValueError as error:
print(type(error).__name__)
若要改為新增一欄,請傳入二維陣列,其列數須與原陣列的列數相同,並且只有一欄新值。執行以下範例:
import numpy as np
matrix = np.array([[1, 2], [3, 4]])
with_column = np.append(matrix, [[5], [6]], axis=1)
print(with_column)
[[1 2 5]
[3 4 6]]
結果仍與 matrix 一樣有兩列,新值則位於第三欄。如果追加輸入的列數不正確,請先檢查維度再重試。