【问题标题】:Efficient way to delete elements in one numpy array from another从另一个数组中删除一个numpy数组中的元素的有效方法
【发布时间】:2016-11-16 04:42:35
【问题描述】:

从另一个 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 的元素对于大型数组来说非常慢。

【问题讨论】:

  • 你为什么要[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] 怎么办?你的案子目前的情况太不具体了。
  • @Evert 是的,在你的第一种情况下,我想要b == [4,5]。在第二种情况下,我已经知道a 只包含b 中的元素。
  • @JohnCrow a 是否也会有重复值,例如:a = [2,2,1,3]

标签: python arrays performance numpy


【解决方案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])

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多