HOWTO · NumPy
從 NumPy 中的陣列中刪除元素
瞭解如何在 Python 中從 NumPy 陣列中刪除一組數字
本頁內容
知道要刪除哪些位置時,請使用 numpy.delete();知道要排除哪些值時,請使用 numpy.setdiff1d()。當某個值出現多次時,這項差異尤其重要:刪除單一位置可以保留其他相同值,而集合差集會回傳不重複的值。
依索引位置使用 numpy.delete() 刪除元素
numpy.delete(arr, obj, axis=None) 會回傳移除指定位置後的新陣列,不會就地修改 arr。obj 可以是整數位置、位置序列或切片。索引從 0 開始,因此位置 3 指的是第四個元素。省略 axis 或將它設為 None 時,NumPy 會先將輸入攤平成一維,再依位置刪除元素。指定 axis 後,位置會對應到該軸:對二維陣列而言,axis 0 選取列,axis 1 選取欄。
以下完整範例會從一維陣列刪除位置 3、5 和 7。請直接執行:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import numpy as np
values = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
positions = [3, 5, 7]
remaining = np.delete(values, positions)
print(remaining)
[ 1 2 3 5 7 9 10]
對矩陣使用 axis=1,會從每一列移除指定位置的欄。若改用 axis=None,結果會先攤平成一維,因此相同的位置會套用到攤平後的序列。
import numpy as np
matrix = np.array([[1, 2, 3, 4, 5], [11, 12, 13, 14, 15], [21, 22, 23, 24, 25]])
without_columns = np.delete(matrix, [1, 2], axis=1)
flattened_without_positions = np.delete(matrix, [1, 2], axis=None)
print(without_columns)
print(flattened_without_positions)
欄位刪除後的結果形狀為 3 × 3;攤平後刪除的結果則是一維,共有 13 個值:
[[ 1 4 5]
[11 14 15]
[21 24 25]]
[ 1 4 5 11 12 13 14 15 21 22 23 24 25]
指定的位置超出範圍時會引發 IndexError。例如,長度為 10 的陣列沒有位置 34。若想顯示簡短的診斷訊息而非完整追蹤資訊,可以捕捉這項錯誤。程式碼中的診斷標籤 Cannot delete position 34: 仍為英文:
import numpy as np
values = np.arange(10)
try:
np.delete(values, [34])
except IndexError as error:
print(f"Cannot delete position 34: {error}")
Cannot delete position 34: index 34 is out of bounds for axis 0 with size 10
如需完整的參數說明,請參閱 numpy.delete() 參考文件。
使用 numpy.setdiff1d() 排除指定值
使用 numpy.setdiff1d(ar1, ar2),可回傳存在於 ar1、但不存在於 ar2 的不重複值。這裡的 ar2 是要排除的值,而不是 ar1 中的位置。預設 assume_unique=False;只有在兩個輸入陣列都已是不重複值時,才將它設為 True。這是由呼叫端提供的假設,因此輸入陣列含有重複值時不要啟用它。
下方範例也說明為何這個函式不能與依位置刪除互換:輸入中有重複的 2,但集合差集結果中的每個剩餘值只會出現一次。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import numpy as np
values = np.array([4, 2, 4, 1, 2, 3])
excluded_values = np.array([4])
remaining = np.setdiff1d(values, excluded_values)
print(remaining)
[1 2 3]
setdiff1d 會產生排序後的不重複結果,因此相較於原始陣列,重複值的處理方式與元素順序都可能改變。若要保留順序及各個元素的出現次數,請改用 numpy.delete() 依位置選取。請參閱 numpy.setdiff1d() 參考文件,瞭解其 assume_unique 參數與回傳行為。
如何選擇依索引位置或依值刪除
要刪除由位置指定的元素時,請使用 numpy.delete()。它會保留其他位置上的相同值,也能讓你指定軸或將陣列攤平。若要依第二個陣列中的值排除元素,且可以接受排序後的不重複結果,請使用 numpy.setdiff1d()。使用集合差集前,請留意重複值與順序;使用 numpy.delete() 時,請確認位置對應到正確的軸,且位於有效範圍內。兩個函式都不會就地修改原始陣列;若要保留結果,請將回傳的新陣列指派給變數。