删除NumPy数组中具有重复项的行

2024-04-27 04:14:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个(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高效地完成这个任务(数组可能非常大)。有人知道我怎么做吗?


Tags: numpy情况数组arrayduplicatesremovedvals
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]])

这是一个选项:

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)
numpy.array([v for v in vals if len(set(v)) == len(v)])

请注意,这还是在幕后循环。你不能回避。但即使是上百万行,它也应该能正常工作。

相关问题 更多 >