从另一个numpy数组中删除元素的最佳方法是什么?基本上我在np.delete()
之后,数组的顺序并不重要。
import numpy as np
a = np.array([2,1,3])
print a
b = np.array([4,1,2,5,2,3])
b = np.delete(b, a) # doesn't work as desired
print b # want [4,5,2]
对于大型数组,迭代a
的元素非常慢。
答案 0 :(得分:1)
这是使用sorting
-
def remove_first_match(a,b):
sidx = b.argsort(kind='mergesort')
unqb, idx = np.unique(b[sidx],return_index=1)
return np.delete(b,sidx[idx[np.in1d(unqb,a)]])
样品运行 -
In [177]: a = np.array([2,1,3])
...: b = np.array([4,1,2,5,2,3,2,3])
...:
In [178]: remove_first_match(a,b)
Out[178]: array([4, 5, 2, 2, 3])
In [179]: a = np.array([2,2,1,3])
...: b = np.array([4,5])
...:
In [180]: remove_first_match(a,b)
Out[180]: array([4, 5])
答案 1 :(得分:1)
您可以使用np.argmax
查找一组行或列中的第一个True元素。因此,例如,您可以通过以下方式执行此操作的广播版本:
>>> a = np.array([2,1,3])
>>> b = np.array([4,1,2,5,2,3])
>>> np.delete(b, np.argmax(b == a[:, np.newaxis], axis=1))
array([4, 5, 2])
当然,与许多numpy矢量化操作一样,速度是以分配大小为len(a) * len(b)
的数组为代价的,因此根据您的输入,这可能不合适。