Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从一个numpy数组中删除另一个numpy数组中元素的有效方法_Python_Arrays_Performance_Numpy - Fatal编程技术网

Python 从一个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

从一个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 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]