从一个numpy数组中删除元素的有效方法

时间:2016-11-16 04:42:35

标签: python arrays performance 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的元素非常慢。

2 个答案:

答案 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)的数组为代价的,因此根据您的输入,这可能不合适。