[英]Numpy Delete for 2-dimensional array
我有一個形狀為 (10, 3) 的 ndarray 和一個長度為 10 的索引列表:
import numpy as np
arr = np.arange(10* 3).reshape((10, 3))
idxs = np.array([0, 1, 1, 1, 2, 0, 2, 2, 1 , 0])
我想使用 numpy delete (或 numpy function 更適合該任務)刪除 arr 中的值,如 idx 所示的每一行。 所以在 arr 的第 0 行,我想刪除第 0 個條目,第一個是第一個,第二個是第一個,依此類推。
我嘗試了類似的東西
np.delete(arr, idxs, axis=1)
但它不會工作。 然后我嘗試建立一個這樣的索引列表:
idlist = [np.arange(len(idxs)), idxs]
np.delete(arr, idlist)
但這也沒有給我想要的結果。
讓我們嘗試通過掩碼提取其他項目,然后重塑:
arr[np.arange(arr.shape[1]) != idxs[:,None]].reshape(len(arr),-1)
@Quang 的回答很好,但可能會從一些解釋中受益。
np.delete
適用於整行或整列,而不是每個選定的元素。
In [30]: arr = np.arange(10* 3).reshape((10, 3))
...: idxs = np.array([0, 1, 1, 1, 2, 0, 2, 2, 1 , 0])
從數組中選擇項目很容易:
In [31]: arr[np.arange(10), idxs]
Out[31]: array([ 0, 4, 7, 10, 14, 15, 20, 23, 25, 27])
選擇除這些之外的所有內容需要更多的工作。 np.delete
是復雜的通用代碼,根據刪除規范執行不同的操作。 但它可以做的一件事是創建一個True
掩碼,並將刪除項設置為False
。
對於您的 2d 案例,我們可以:
In [33]: mask = np.ones(arr.shape, bool)
In [34]: mask[np.arange(10), idxs] = False
In [35]: arr[mask]
Out[35]:
array([ 1, 2, 3, 5, 6, 8, 9, 11, 12, 13, 16, 17, 18, 19, 21, 22, 24,
26, 28, 29])
boolean
索引產生一個平面數組,所以我們需要重塑以獲得 2d:
In [36]: arr[mask].reshape(10,2)
Out[36]:
array([[ 1, 2],
[ 3, 5],
[ 6, 8],
[ 9, 11],
[12, 13],
[16, 17],
[18, 19],
[21, 22],
[24, 26],
[28, 29]])
Quand 的回答以另一種方式創建了面具:
In [37]: arr[np.arange(arr.shape[1]) != idxs[:,None]]
Out[37]:
array([ 1, 2, 3, 5, 6, 8, 9, 11, 12, 13, 16, 17, 18, 19, 21, 22, 24,
26, 28, 29])
感謝您的問題以及 Quang 和 hpaulj 的回答。 我只想添加第二個 senario,其中一個想要從另一個軸進行刪除。
索引現在只有 3 個元素,因為arr
只有 3 列,例如:
idxs2 = np.array([1,2,3])
要根據idxs2
中的索引刪除每一列的元素,可以這樣做
arr.T[np.array(np.arange(arr.shape[0]) != idxs2[:,None])].reshape(len(idxs2),-1).T
結果變成:
array([[ 0, 1, 2],
[ 6, 4, 5],
[ 9, 10, 8],
[12, 13, 14],
[15, 16, 17],
[18, 19, 20],
[21, 22, 23],
[24, 25, 26],
[27, 28, 29]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.