簡體   English   中英

Numpy 刪除二維數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM