我有一个混合数据类型的numpy数组:mat_resized
array([[25041, '40391', '5856', '5601', 'V4511', 'V5867'],
[25041, '40391', '25081', '5856', '5363', '3572'],
[25041, '40391', '42822', '99681', '5856', '2851'],
[25061, '40391', '5845', '2875', '3570', '2762'],
[25041, '40391', '2761', '5856', '25081', 'V4511'],
[40391, '25002', '5856', '3569', 'V4511', 'V5867']], dtype=object)
如何计算数组中所有值的出现次数,并按降序显示?
我使用了以下代码:
unique, counts = np.unique(mat_resized, return_counts=True)
counts
收到以下错误:
TypeError Traceback (most recent call last)
<ipython-input-67-f9f2a0dd18c1> in <module>()
----> 1 unique, counts = np.unique(mat_resized, return_counts=True)
2 counts
C:\Anaconda3\lib\site-packages\numpy\lib\arraysetops.py in unique(ar, return_index, return_inverse, return_counts)
194 aux = ar[perm]
195 else:
--> 196 ar.sort()
197 aux = ar
198 flag = np.concatenate(([True], aux[1:] != aux[:-1]))
TypeError: unorderable types: str() > int()
答案 0 :(得分:1)
在Python 2.7中,numpy.unique
应该可行。 (由于对象数组中的混合类型,numpy.unique
在Python 3中不起作用;请参阅下面的解决方法。)例如,在下文中,values
是一个包含a
中的唯一值和counts
是一个对应的数组,其中包含值a
中出现的次数。
In [31]: a
Out[31]:
array([[123, '40381', 'V5856', 0.0],
[456, '40381', '25081', 0.0],
[789, 'V5856', '51851', 0.0]], dtype=object)
In [32]: values, counts = np.unique(a, return_counts=True)
In [33]: values
Out[33]: array([0.0, 123, 456, 789, '25081', '40381', '51851', 'V5856'], dtype=object)
In [34]: counts
Out[34]: array([3, 1, 1, 1, 1, 2, 1, 2])
要按计数降序排列值,请使用counts.argsort()
的结果重新排序values
和counts
:
In [35]: order = counts.argsort()[::-1]
In [36]: values[order]
Out[36]: array([0.0, 'V5856', '40381', '51851', '25081', 789, 456, 123], dtype=object)
In [37]: counts[order]
Out[37]: array([3, 2, 2, 1, 1, 1, 1, 1])
Python 3的解决方法是将数组的所有元素转换为字符串。这是否能解决您的问题取决于您对np.unique
的结果的处理方式。
这是相同的例子,使用Python 3.4.3和numpy 1.10.1:
In [23]: a
Out[23]:
array([[123, '40381', 'V5856', 0.0],
[456, '40381', '25081', 0.0],
[789, 'V5856', '51851', 0.0]], dtype=object)
In [24]: values, counts = np.unique(a.astype(str), return_counts=True)
In [25]: values
Out[25]:
array(['0.0', '123', '25081', '40381', '456', '51851', '789', 'V5856'],
dtype='<U5')
In [26]: counts
Out[26]: array([3, 1, 1, 2, 1, 1, 1, 2])
In [27]: order = counts.argsort()[::-1]
In [28]: values[order]
Out[28]:
array(['0.0', 'V5856', '40381', '789', '51851', '456', '25081', '123'],
dtype='<U5')
In [29]: counts[order]
Out[29]: array([3, 2, 2, 1, 1, 1, 1, 1])