【问题标题】:How to get unique rows and their occurrences for 2D array?如何获取二维数组的唯一行及其出现?
【发布时间】:2016-10-06 15:36:49
【问题描述】:

我有一个二维数组,它有一些重复的列。我希望能够查看有哪些独特的列,以及重复的列在哪里。

我自己的数组太大放在这里,但这里是一个例子:

a = np.array([[ 1.,  0.,  0.,  0.,  0.],[ 2.,  0.,  4.,  3.,  0.],])

这具有唯一的列向量 [1.,2.][0.,0.][0.,4.][0.,3.]。有一个重复:[0.,0.] 出现两次。

现在我找到了一种获取唯一向量及其索引here 的方法,但我不清楚如何获得重复项的出现。我尝试了几种幼稚的方法(使用np.where 和列表组合),但这些方法都非常非常慢。肯定有一种 numpythonic 的方式吗?

在 matlab 中,它只是 unique 函数,但 np.unique 使数组变平。

【问题讨论】:

  • @WarrenWeckesser 我链接了它,因为它解决了查找唯一行的问题,但它没有解决查找数组中重复项所在位置的问题
  • 您打算用重复的 ID 标记重复的列吗?还是您打算计算重复列的数量?
  • 我希望能够说出类似{col1: [0], col2: [1, 4], col3: [2], col4: [3]} 的话,即列出每个唯一列出现在数组中的位置。

标签: python arrays numpy unique


【解决方案1】:

这是一种矢量化方法,可以为我们提供一个数组列表作为输出 -

ids = np.ravel_multi_index(a.astype(int),a.max(1).astype(int)+1)
sidx = ids.argsort()
sorted_ids = ids[sidx]
out = np.split(sidx,np.nonzero(sorted_ids[1:] > sorted_ids[:-1])[0]+1)

示例运行 -

In [62]: a
Out[62]: 
array([[ 1.,  0.,  0.,  0.,  0.],
       [ 2.,  0.,  4.,  3.,  0.]])

In [63]: out
Out[63]: [array([1, 4]), array([3]), array([2]), array([0])]

【讨论】:

    【解决方案2】:

    numpy_indexed 包(免责声明:我是它的作者)包含用于计算此类事物的高效功能:

    import numpy_indexed as npi
    unique_columns = npi.unique(a, axis=1)
    non_unique_column_idx = npi.multiplicity(a, axis=1) > 1
    

    或者:

    unique_columns, column_count = npi.count(a, axis=1)
    duplicate_columns = unique_columns[:, column_count > 1]
    

    【讨论】:

      【解决方案3】:

      对于小数组:

          from collections import defaultdict
          indices = defaultdict(list)
          for index, column in enumerate(a.transpose()):
              indices[tuple(column)].append(index)
          unique = [kk for kk, vv in indices.items() if len(vv) == 1]
          non_unique = {kk:vv for kk, vv in indices.items() if len(vv) != 1}
      

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 1970-01-01
        • 2020-04-12
        • 2011-05-12
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        • 1970-01-01
        • 2015-05-19
        相关资源
        最近更新 更多