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])
答案 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}}。