在NumPy数组中删除重复行

13 投票
5 回答
14199 浏览
提问于 2025-04-17 02:24

我有一个形状为 (N,3) 的 numpy 数组:

>>> vals = numpy.array([[1,2,3],[4,5,6],[7,8,7],[0,4,5],[2,2,1],[0,0,0],[5,4,3]])
>>> vals
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 7],
       [0, 4, 5],
       [2, 2, 1],
       [0, 0, 0],
       [5, 4, 3]])

我想从这个数组中去掉那些有重复值的行。比如,上面的数组处理后的结果应该是:

>>> duplicates_removed
array([[1, 2, 3],
       [4, 5, 6],
       [0, 4, 5],
       [5, 4, 3]])

我不太确定怎么用 numpy 高效地做到这一点,而不需要循环(因为数组可能会很大)。有没有人知道我该怎么做?

5 个回答

2
numpy.array([v for v in vals if len(set(v)) == len(v)])

请注意,这个过程在后台还是会循环的。你无法避免这一点。不过,即使是处理上百万行数据,它也应该能正常工作。

3

这里有一种处理任意列数的方法,同时还能保持向量化的特性 -

def rows_uniq_elems(a):
    a_sorted = np.sort(a,axis=-1)
    return a[(a_sorted[...,1:] != a_sorted[...,:-1]).all(-1)]

步骤:

  • 对每一行进行排序。

  • 检查每一行中相邻元素之间的差异。因此,任何一行中如果有至少一个相邻元素的差是零,就说明有重复的元素。我们将用这个来获取有效行的标记。最后一步就是根据这个标记,从输入数组中选择有效的行。

示例运行 -

In [49]: a
Out[49]: 
array([[1, 2, 3, 7],
       [4, 5, 6, 7],
       [7, 8, 7, 8],
       [0, 4, 5, 6],
       [2, 2, 1, 1],
       [0, 0, 0, 3],
       [5, 4, 3, 2]])

In [50]: rows_uniq_elems(a)
Out[50]: 
array([[1, 2, 3, 7],
       [4, 5, 6, 7],
       [0, 4, 5, 6],
       [5, 4, 3, 2]])
11

这是一个选择:

import numpy
vals = numpy.array([[1,2,3],[4,5,6],[7,8,7],[0,4,5],[2,2,1],[0,0,0],[5,4,3]])
a = (vals[:,0] == vals[:,1]) | (vals[:,1] == vals[:,2]) | (vals[:,0] == vals[:,2])
vals = numpy.delete(vals, numpy.where(a), axis=0)

撰写回答