繁体   English   中英

计算numpy数组混合数据类型并以降序显示

[英]Count numpy array mixed data types and display in descending order

我有一个混合数据类型的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() 

在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()的结果对valuescounts进行重新排序:

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])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM