对于此矩阵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]
谢谢!
答案 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]