Python 二维数组的Numpy Delete

Python 二维数组的Numpy Delete,python,arrays,python-3.x,numpy,Python,Arrays,Python 3.x,Numpy,我有一个形状的数组(10,3)和一个长度为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函数)删除arr中的值,如idxs为每行所指示的。因此,在arr的第0行中,我想删除第0个条目,在第一行中删除第一个条目,在第二行中删除第一个条目,依此类推 我试

我有一个形状的数组(10,3)和一个长度为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函数)删除arr中的值,如idxs为每行所指示的。因此,在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
是复杂的通用代码,根据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
索引生成平面数组,因此我们需要重新造型以获得二维:

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

谢谢你的详细解释。我很惊讶,虽然numpy没有提供更多的'开箱即用'。似乎是个常见问题。我以前从未遇到过像你这样的问题。关于删除和
np.delete
,有很多问题,但与您的规范完全一致的问题很少
numpy
索引非常复杂,但它的重点是选择。删除本质上更为间接。