Python with numpy:如何根据特定索引从二维数组的每一行中删除元素

Python with numpy:如何根据特定索引从二维数组的每一行中删除元素,python,numpy,Python,Numpy,假设我有一个尺寸为20 x 10的二维numpy阵列 我还有一个长度为20的数组,del_ind 我想根据delu ind从A的每一行中删除一个元素,以得到一个大小为20 x 9的结果数组 我该怎么做 我查看了指定轴为1的np.delete,但这只会从每行的相同位置删除元素 感谢您的帮助Numpy不以就地编辑著称;它主要用于静态大小的矩阵。出于这个原因,我建议通过将所需的元素复制到新数组来实现这一点 假设每行删除一列就足够了: def删除索引(arr,索引): 结果=np.空((arr.shap

假设我有一个尺寸为20 x 10的二维numpy阵列

我还有一个长度为20的数组,del_ind

我想根据delu ind从A的每一行中删除一个元素,以得到一个大小为20 x 9的结果数组

我该怎么做

我查看了指定轴为1的np.delete,但这只会从每行的相同位置删除元素


感谢您的帮助

Numpy不以就地编辑著称;它主要用于静态大小的矩阵。出于这个原因,我建议通过将所需的元素复制到新数组来实现这一点

假设每行删除一列就足够了:

def删除索引(arr,索引):
结果=np.空((arr.shape[0],arr.shape[1]-1))
对于枚举(zip(索引,arr))中的i(删除_索引,行):
结果[i]=np.delete(行,删除索引)
返回结果

您可能需要构建一个新阵列

幸运的是,您可以使用奇特的索引避免此任务的python循环:

h, w = 20, 10
A = np.arange(h*w).reshape(h, w)
del_ind = np.random.randint(0, w, size=h)
mask = np.ones((h,w), dtype=bool)
mask[range(h), del_ind] = False
A_ = A[mask].reshape(h, w-1)
使用较小的数据集演示:

>>> h, w = 5, 4
>>> %paste
A = np.arange(h*w).reshape(h, w)
del_ind = np.random.randint(0, w, size=h)
mask = np.ones((h,w), dtype=bool)
mask[range(h), del_ind] = False
A_ = A[mask].reshape(h, w-1)

## -- End pasted text --
>>> A
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19]])
>>> del_ind
array([2, 2, 1, 1, 0])
>>> A_
array([[ 0,  1,  3],
       [ 4,  5,  7],
       [ 8, 10, 11],
       [12, 14, 15],
       [17, 18, 19]])

您可能会考虑屏蔽阵列。否则,numpy并不是专门为此设计的,您可能需要构建一个新的阵列。这是因为数据存储在内存中的方式。您是否可以使用屏蔽数组或任何其他方法(构建新数组或其他方法)提出解决方案,只要它比for循环快?
np.delete
或者像这样使用
keep
屏蔽,或者复制切片,这样做需要更多的代码。事实上我也在考虑同样的方向,但是这个代码比我写的更整洁。非常感谢。