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])
argsort
:>>> a.argsort().argsort()
array([0, 3, 1, 2])
argsort
应用两次于一个数组是计算值排名的常见方法(参见这里)。虽然双重 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
运行时可以忽略。