Python 二维数组的Numpy Delete
我有一个形状的数组(10,3)和一个长度为10的索引列表: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个条目,在第一行中删除第一个条目,在第二行中删除第一个条目,依此类推 我试
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
索引非常复杂,但它的重点是选择。删除本质上更为间接。