如何在numpy中找到两个排序数组的集合差异?

时间:2018-04-08 03:03:11

标签: numpy

我想使用数组strdup(saisie)来索引另一个数组rows的行。最初,x包含rows的所有行的索引(并因此排序)。在整个计划中,选择从x中删除一些索引exclude。与rows本身类似,rows是一个排序数组。

查找excluderows的设定差异的最佳方法是什么?

我想到了几个不同的选项,但我认为它们的复杂性超过exclude,其中O(n + m)n的长度,rows是长度m

  1. exclude
  2. 此解决方案每次都需要查找new_rows = [r for r in rows if r not in exclude]因此exclude复杂度。

    1. O(mn)
    2. 这可能需要new_rows = setdiff1d(rows, exclude, assume_unique=True),但我不确定。

      1. O(nlogm)转换为exclude并运行1.此方法的问题在于它需要额外的内存,但它符合复杂性要求。

1 个答案:

答案 0 :(得分:1)

以下是两个O(n + m)选项的概述:

1)heapq.merge将在线性时间内组合两个排序的序列。当组合序列被排序时,共享索引将彼此相邻。

2)正如您所描述的那样rows是一个"稀疏范围"我假设rows的最大值不是太大。因此,您可以分配该大小的数组E(如果我们不对其进行初始化,则为O(1),即使用np.empty)。然后使用rowsexclude索引到空数组。例如,您撰写E[rows] = 1 E[exclude] = 0,然后查看E[rows]并删除E已从rows更改为1的{​​{1}}的所有元素}。

如果两个集合未排序,则选项2也可以使用。