numpy.unique基于计数排序

meo*_*eow 7 python sorting numpy unique python-3.x

numpy.unique如果return_counts为,则该函数允许返回唯一元素的计数True。现在,返回的元组由两个数组组成,一个数组包含唯一元素,第二个数组包含一个count数组,两者均由唯一元素排序。现在是否有一种方法可以根据counts数组而不是唯一元素对它们进行排序?我的意思是我知道如何做到这一点很困难,但是在这种情况下是否存在一些简洁的单行或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)
Run Code Online (Sandbox Code Playgroud)

它返回与此类似的东西:

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

但是,我想要拥有:

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

Kas*_*mvd 11

您不能直接使用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])
Run Code Online (Sandbox Code Playgroud)