如何在Python中获取原始列表的排序列表的索引?

时间:2015-02-17 23:58:46

标签: python sorting numpy

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 个答案:

答案 0 :(得分:4)

您可以随时致电argsort两次:

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

据我所知,没有"双argsort" NumPy中可用的函数,但将argsort两次应用于数组是计算值的等级的常用方法(参见here)。

答案 1 :(得分:3)

虽然双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的线性复杂性。实际上,这意味着,对于足够大的数组,上面的代码的运行速度是double argsort的两倍,因为创建和填充rev_argsort的时间与第一个argsort相比可以忽略不计。 1}}。