Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从numpy中不同长度的唯一数组组成频率列表_Python_Arrays_Numpy_Unique - Fatal编程技术网

Python 如何从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数组是不可散列的,因此我通过将数组转换为其字符串

我有一个不同长度的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)