1

我有一个不同长度的numpy数组列表,其中一些重复,如下所示:

import numpy as np

multi = [np.array([1, 2, 3]),
      np.array([1, 2]),
      np.array([1, 2, 3, 4]),
      np.array([1, 2, 3]),
      np.array([1, 2])]

从这个列表中,我想要一个唯一数组的计数(如序列上的直方图)。

由于 numpy 数组不可散列,因此我通过将数组转换为其字符串表示形式并将其用作与此方法itertools.groupby类似的分组键来执行此操作,

import itertools

sorted_strings = sorted([str(p) for p in multi])
groups = [(k, len(list(g))) for k, g in itertools.groupby(sorted_strings)]
print(groups)

输出是:

[('[1 2 3 4]', 1), ('[1 2 3]', 2), ('[1 2]', 2)]

这是正确的,但我想知道是否有更优雅的解决方案,或者是否有比数组列表更好的方法来存储这些数据。

4

2 回答 2

2

您可以使用collections.Counter

>>> from collections import Counter
>>> 
>>> Counter(map(tuple, multi)).most_common()
[((1, 2), 2), ((1, 2, 3), 2), ((1, 2, 3, 4), 1)]

为了最不常见:

>>> Counter(map(tuple, multi)).most_common()[::-1]
[((1, 2, 3, 4), 1), ((1, 2, 3), 2), ((1, 2), 2)]
于 2012-10-26T22:07:18.073 回答
0

如果你遇到了一个没有定义的 Python 版本collections.Counter,你可以使用你链接到的方法:

 base = sorted(tuple(m) for m in multi)
 G=[(k,len(list(g))) for (k,g) in itertools.groupby(base)]

您基本上将每个数组转换为一个元组(请注意,Counter基于 - 的方法依赖于相同的方法)。

请注意,您可能希望确保您的数组已排序,因此np.array([2,1])np.array([1,2])被认为是等效的:

 base = sorted(tuple(sorted(m)) for m in multi)
于 2012-10-29T12:53:10.907 回答