Python 如何从numpy中不同长度的唯一数组组成频率列表
我有一个不同长度的numpy数组列表,其中一些重复,如下所示:Python 如何从numpy中不同长度的唯一数组组成频率列表,python,arrays,numpy,unique,Python,Arrays,Numpy,Unique,我有一个不同长度的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数组是不可散列的,因此我通过将数组转换为其字符串
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进行分组的键来实现这一点
其输出为:
[('[1 2 3 4]', 1), ('[1 2 3]', 2), ('[1 2]', 2)]
这是正确的,但我想知道是否有更优雅的解决方案,或者是否有比数组列表更好的方法来存储这些数据。您可以使用:
要获得最不常见的:
>>> Counter(map(tuple, multi)).most_common()[::-1]
[((1, 2, 3, 4), 1), ((1, 2, 3), 2), ((1, 2), 2)]
如果您使用的Python版本没有定义collections.Counter
,您可以使用链接到的方法:
base = sorted(tuple(m) for m in multi)
G=[(k,len(list(g))) for (k,g) in itertools.groupby(base)]
基本上将每个数组转换为一个元组(请注意,基于计数器的方法依赖于相同的方法)
请注意,您可能希望确保数组已排序,以便将np.array([2,1])
和np.array([1,2])
视为等效:
base = sorted(tuple(sorted(m)) for m in multi)
也许可以使用numpy,但老实说,由于数组看起来很小,除非有充分的理由或使用完全不同的方法,否则我会说只使用元组,它们是可散列的。。。字符串真的是一个大黑客,你将如何回到一个体面的类型从那里…谢谢你的有用的答案和评论!在我的应用程序中,序列更长,而且数量更多。但是,既然我似乎需要将numpy数组转换成可散列的东西,元组肯定比字符串更有意义。
base = sorted(tuple(m) for m in multi)
G=[(k,len(list(g))) for (k,g) in itertools.groupby(base)]
base = sorted(tuple(sorted(m)) for m in multi)