如何在Python中获取已排序列表的索引以便对应原始列表?

6

NumPy的argsort函数返回排序后列表的原始索引。现在我想要原始列表的排序索引,是否有函数或一种优雅的方法可以做到这一点?

例如:

>>> 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个回答

9
您可以始终两次调用 argsort
>>> a.argsort().argsort()
array([0, 3, 1, 2])

据我所知,NumPy 中没有“双重 argsort”函数可用,但将 argsort 应用两次于一个数组是计算值排名的常见方法(参见这里)。

多么明智的解决方案! - gerry

7

虽然双重 argsort 技巧能够实现功能,但效率不是很高。您可以通过使用高级索引(fancy indexing)来获得更好的性能:

>>> 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的对数线性复杂度。实际上,这意味着对于足够大的数组,上述代码将比双重argsort运行快两倍,因为创建和填充rev_argsort的时间将在第一个argsort运行时可以忽略。


我同意。使用赋值而不是排序是更合理的解决方案。感谢指出! - gerry

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