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

时间:2018-04-21 16:52:49

标签: python arrays python-3.x list matrix

对于此矩阵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 个答案:

答案 0 :(得分:2)

以下是collections.defaultdict的一种方法。它通过for循环使用enumerate进行迭代,并使用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]})

答案 1 :(得分:1)

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

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

根据评论进行修改:

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

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]]

<强>原始

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

  • 忽略(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]