numpy.unique基于计数排序

时间:2018-02-14 10:29:24

标签: python python-3.x sorting numpy unique

numpy.unique函数允许在return_countsTrue时返回唯一元素的计数。现在返回的元组由两个包含唯一元素的数组组成,第二个包含一个count数组,两者都按唯一元素排序。现在有没有办法根据计数数组而不是唯一元素进行排序?我的意思是我知道如何以艰难的方式去做,但这种情况下是否有一些简洁的单线或lambda功能?

目前的结果:

my_chr_list = ["a","a","a", "b", "c", "b","d", "d"]
unique_els, counts = np.unique(my_chr_list, return_counts=True)
print(unique_els, counts)

返回的内容如下:

>>> (array(['a', 'b', 'c', 'd'], 
     dtype='<U1'), array([3, 2, 1, 2], dtype=int64))

然而,我想要的是:

>>> (array(['a', 'b', 'd', 'c'], 
     dtype='<U1'), array([3, 2, 2, 1], dtype=int64))

1 个答案:

答案 0 :(得分:6)

您无法直接使用unique功能执行此操作。相反,作为Numpythonic方法,您可以使用return_index关键字获取唯一项的索引,然后使用np.argsort获取已排序count项的索引并使用结果查找基于频率的项目。

In [33]: arr = np.array(my_chr_list)

In [34]: u, count = np.unique(my_chr_list, return_counts=True)

In [35]: count_sort_ind = np.argsort(-count)

In [36]: u[count_sort_ind]
Out[36]: 
array(['a', 'b', 'd', 'c'], 
      dtype='<U1')

In [37]: count[count_sort_ind]
Out[37]: array([3, 2, 2, 1])