为重复数据删除的点集生成numpy索引数组

时间:2015-03-09 18:18:03

标签: python arrays numpy deduplication

我有一个至少十万分(最多30亿)的数组,其中一些是重复的。我想重复删除点并生成一个索引数组,该数组保留重复点的原始序列。

例如:

x = [(0, 0),  # (x1, y1)
     (1, 0),  # (x2, y2)
     (1, 1),  # (x3, y3)
     (0, 0)]  # (x4, y4)

重复数据删除x,我们有y:

y = list(set(x)) = [(1, 0),  # (x2, y2)
                    (0, 0),  # (x1, y1) and (x4, y4)
                    (1, 1)]  # (x3, y3)

然后我们将得到一个结果索引数组,z:

z = [1,  # (x1, y1) 
     0,  # (x2, y2)
     2,  # (x3, y3)
     1]  # (x4, y4)

获得z是否有类似numpy的方式?这是一个强力实施:

z = []
for each_point in x:
    index = y.index(each_point)
    z.append(index)

2 个答案:

答案 0 :(得分:2)

x2 = np.ascontiguousarray(x).view(np.dtype((np.void, x.dtype.itemsize * x.shape[1])))
y_temp, z = np.unique(x2, return_inverse=True)
y = y_temp.view(dtype='int64').reshape(len(y_temp), 2)
print(y)
print(z)

产量

[[0 0]
 [1 0]
 [1 1]]

[0 1 2 0]

信用:Find unique rows in numpy.array

答案 1 :(得分:2)

使用numpy_indexed包可以优雅地解决此问题(免责声明:我是其作者)。它类似于Alex在引擎盖下发布的解决方案;但是有更好的界面和更多的测试:

 $("html, body").animate({ scrollTop: element_to_scroll_to.position().top }, 1);