2015-02-17 99 views
2

numpy的argsort函数返回排序列表的原始索引。 现在我需要原始列表的排序列表的索引。有没有 一个功能或一个优雅的方式来做到这一点?如何获取Python中原始列表的排序列表的索引?

例如:

>>> import numpy as np 
>>> a = np.array([2, 8 , 5, 6]) 
>>> np.argsort(a) 
array([0, 2, 3, 1]) 
>>> function(a) 
array([0, 3, 1, 2]) 

回答

2

你可以随时拨打argsort两次:

>>> a.argsort().argsort() 
array([0, 3, 1, 2]) 

据我所知,有没有 “双argsort” 在NumPy的可用功能,但应用argsort两次到数组是计算值的排列的常用方法(参见here)。

+0

一个明智的解决方案! – gerry 2015-02-18 00:07:36

2

虽然双argsort技巧的作品,它不是很有效。您可以通过使用花哨的索引获得更好的性能:

>>> argsort = a.argsort() 
>>> rev_argsort = np.empty(argsort.shape, dtype=np.intp) 
>>> rev_argsort[argsort] = np.arange(len(a)) 
>>> rev_argsort 
array([0, 3, 1, 2]) 

更详细,但它具有线性复杂代替的argsort的linearithmic复杂。实际上,这意味着,对于足够大的阵列,上述代码将运行两倍于双重argsort,因为创建和填充rev_argsort的时间与第一个argsort的时间相比可以忽略不计。

+0

我同意。使用赋值而不是排序是一个更合理的解决方案。感谢您指出! – gerry 2015-02-18 01:15:08