Python 从一个numpy数组中删除另一个numpy数组中元素的有效方法
从一个numpy数组中删除另一个numpy数组中的元素的最佳方法是什么?基本上我是在寻找Python 从一个numpy数组中删除另一个numpy数组中元素的有效方法,python,arrays,performance,numpy,Python,Arrays,Performance,Numpy,从一个numpy数组中删除另一个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元素的速度非常慢。下面是一种使用排序的方法- def
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
元素的速度非常慢。下面是一种使用排序的方法-
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])
您可以使用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)
的数组为代价的,因此根据您的输入,这可能不合适。为什么要[4,5,2]
2
也在a
中,因此它应该被删除,b
将是[4,5]
@Evert我试图只删除a
中元素的第一个实例。正如所写的a
有两个2
,那么如果a=[2,2,1,3]
,b=[4,5]
?如果a=[2,2,2,1,3]
呢?您的案例太不具体了。@即使是,在您的第一个案例中,我希望b==[4,5]
。在第二种情况下,我已经知道a
只包含b
中的元素@JohnCrow将a
也有重复的值,比如:a=[2,2,1,3]
?