我有一个用整数填充的向量矩阵。例如:
[[1, 2, 3],
[2, 3, 1],
[1, 2, 3],
[2, 3, 1],
[2, 3, 1]]
我想计算所有可区分的向量,以获得类似这样的结果:
[[2, [1, 2, 3]],
[3, [2, 3, 1]]]
首先,我有出现的次数,然后是向量。
在SQL中,可以使用COUNT + GROUP BY完成。
但是,如何使用python“智能”计算它?
答案 0 :(得分:2)
仅在Python中,您可以使用Counter
:
from collections import Counter
matrix = [[1, 2, 3],
[2, 3, 1],
[1, 2, 3],
[2, 3, 1],
[2, 3, 1]]
c = Counter(map(tuple, matrix))
result = [[count, list(row)] for row, count in c.items()]
print(result)
# [[2, [1, 2, 3]], [3, [2, 3, 1]]]
使用NumPy,您可以使用np.unique
:
import numpy as np
matrix = np.array([[1, 2, 3],
[2, 3, 1],
[1, 2, 3],
[2, 3, 1],
[2, 3, 1]])
rows, counts = np.unique(matrix, axis=0, return_counts=True)
result = [[count, list(row)] for row, count in zip(rows, counts)]
print(result)
# [[2, [1, 2, 3]], [3, [2, 3, 1]]]
答案 1 :(得分:1)
首先将m的每个子列表转换为元组。然后使用collections.Counter
来计算主列表中元组的出现次数。现在,使用键(无计数)和值(元组)遍历此计数器对象,并将其附加到这样的新列表中:
from collections import Counter
m = [[1, 2, 3],
[2, 3, 1],
[1, 2, 3],
[2, 3, 1],
[2, 3, 1]]
m = map(tuple, m)
l = []
for k,v in Counter(m).items():
l.append([v, list(k)])
输出:
[[2, [1, 2, 3]], [3, [2, 3, 1]]]
注意:Counter(m)
产生此计数器对象:
Counter({(2, 3, 1): 3, (1, 2, 3): 2})
答案 2 :(得分:0)
我使用键值对的哈希映射(它是字典)来记录这些值。这样会产生一个字典,但是如果需要,可以将其重新排列为列表。
我认为,仅引用字典中的键,就可以更容易地返回元素在列表中出现的次数。
nested_array = [[1, 2, 3],
[2, 3, 1],
[1, 2, 3],
[2, 3, 1],
[2, 3, 1]]
hashmap ={}
for element in nested_array:
d=repr(element)
if d not in hashmap:
d=repr(element)
hashmap[d]=1
elif d in hashmap:
hashmap[d] += 1
print(hashmap)