python中的矩阵COUNT + GROUP BY

时间:2019-08-19 10:39:53

标签: python matrix

我有一个用整数填充的向量矩阵。例如:

[[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“智能”计算它?

3 个答案:

答案 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)

这是输出: enter image description here