首页 文章

Python:提取与矩阵中非零唯一行对应的重复行的索引

提问于
浏览
0

对于这个矩阵K =

[[1.  2.  3.]
 [ 0.  0.  0.]
 [ 4.  5.  6.]
 [ 0.  0.  0.]
 [ 4.  5.  6.]
 [ 0.  0.  0.]]

如何在矩阵中存储与非零唯一行对应的重复行的索引列表/数组 .

在此示例中:[0,2]是非零唯一行的索引 .

问题:如何将这些信息存储在字典中:

corresponding value for key 0: [0]
   corresponding value for key 2: [2,4]

谢谢!

2 回答

  • 1

    这是通过 collections.defaultdict 的一种方法 . 它通过带有 enumeratefor 循环进行迭代,并使用 set 来跟踪看到的项目 .

    您可以在结尾处轻松地从字典中删除 (0, 0, 0) ,并在必要时重命名密钥 . 该方法的复杂度为O(n) .

    from collections import defaultdict
    
    A = np.array([[ 1,  2,  3],
                  [ 0,  0,  0],
                  [ 4,  5,  6],
                  [ 0,  0,  0],
                  [ 4,  5,  6],
                  [ 0,  0,  0]])
    
    seen = {(0, 0, 0)}
    d = defaultdict(list)
    
    for idx, row in enumerate(map(tuple, A)):
        d[row].append(idx)
    

    结果:

    print(d)
    
    defaultdict(list, {(0, 0, 0): [1, 3, 5],
                       (1, 2, 3): [0],
                       (4, 5, 6): [2, 4]})
    
  • 2

    鉴于您的数据位于元组列表中 .

    data = [
      (1, 2, 3),
      (0, 0, 0),
      (4, 5, 6),
      (0, 0, 0),
      (4, 5, 6),
      (0, 0, 0),
      ]
    

    Edit in response to comments:

    将数据反转为默认字典,将索引附加到附加到字典中每个键的列表中 .

    import collections
    output = collections.defaultdict(list)
    for i,v in enumerate(data):
      if v == (0,0,0):
        continue
      output[v].append(i)
    print(output.values())
    

    输出是:

    [[0], [2, 4]]
    

    Original

    一个简单的循环就行了 . 这将

    • 忽略 (0,0,0)

    • 记录任何连续重复集的第一个实例的索引

    它将索引存储在 set() 中以获得性能,但最后对它们进行排序 .

    output = set()
    lastval = None
    lasti = None
    
    for i, val in enumerate(data):
      if val == (0,0,0):
        continue
    
      if val != lastval:
        lastval = val
        lasti = i
    
      if lasti not in output:
        output.add(lasti)
    
    print(sorted(output))
    

    输出是

    [0, 2]
    

相关问题