【问题标题】:Generating numpy array of indices for a deduplicated set of points为重复数据删除的点集生成 numpy 索引数组
【发布时间】:2015-03-09 18:18:02
【问题描述】:

我有一个包含至少 10 万个点(最多 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)

有没有类似 numpy 的方式来获取 z?这是一个蛮力实现:

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

【问题讨论】:

  • 不想学究气,但我在这里看不到任何numpy。更重要的是:我认为您不能创建包含元组作为元素的 numpy 数组。最后:numpy.where 是您可以在 numpy array 上使用的函数,但如果您需要定位(许多)元素,它会很昂贵。
  • 我认为在问题中使用 numpy 会混淆实际问题,这实际上是在寻找与蛮力实现的平等。我在发布之前查看了哪里,但我没有看到与我想做的匹配的示例。
  • 我认为 this 几乎正是您要找的东西
  • 其实我前段时间也遇到过同样的(类型)问题,也没有找到好的解决方案。 python list + set + dict 'brute force' 方法比使用 numpy 快得多;索引到 numpy 数组非常慢。
  • @ali_m:谢谢 - 这实际上可以解决 my 问题! ;-)

标签: python arrays numpy deduplication


【解决方案1】:
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

【讨论】:

  • 谢谢亚历克斯。我认为这提供了“z”,但我需要 y 和 z。如果我明白这里发生了什么,那么我需要从排序的“z”构造“y”。 y = np.array(sorted(tuple(x[idx]) for idx in np.unique(z)))
  • 一点也不,我只是忽略了解压缩的值(并且只保留了索引)。查看更新的答案。
【解决方案2】:

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

import numpy_indexed as npi
y, z = npi.unique(x, return_inverse=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-17
    • 2015-09-14
    • 2018-10-25
    • 2018-12-20
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多