基于计数排序的numpy.unique排序

16
numpy.unique函数允许在return_countsTrue时返回唯一元素的计数。现在返回的元组包含两个数组,一个包含唯一元素,第二个包含计数数组,两个数组都按唯一元素排序。现在是否有一种方法按计数数组而不是唯一元素对两者进行排序?我的意思是,我知道如何通过困难的方法来做到这一点,但是否有一些简洁的单行或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个回答

24

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

我认为 np.argsort(-count) 中的 -count 是返回反向排序数组的索引。我在numpy文档中没有找到这个说明;使用负数索引列表数据结构通常会导致返回的顺序相反,这是一个经验法则吗?提前感谢您的回答。 - Sumax
1
@SumanthLazarus 不,文档中没有明确提到这一点。这完全取决于排序函数的工作方式。也就是说,它们如何对给定的可迭代对象进行排序(降序或升序),使用否定可以反转排序顺序。 - Mazdak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接