ger*_*rry 4 python sorting numpy
该argsortnumpy的函数返回排序列表的原始索引。现在我想要原始列表的排序列表索引。有功能或优雅的方式可以做到这一点吗?
例如:
>>> 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])
Run Code Online (Sandbox Code Playgroud)
您可以随时拨打argsort两次:
>>> a.argsort().argsort()
array([0, 3, 1, 2])
Run Code Online (Sandbox Code Playgroud)
据我所知,NumPy中没有可用的“ double-argsort”函数,但是argsort对数组应用两次是计算值的等级的一种常见方法(请参阅此处)。
虽然双重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])
Run Code Online (Sandbox Code Playgroud)
它更冗长,但它具有线性复杂度,而不是 的线性复杂度argsort。实际上,这意味着,对于足够大的数组,上述代码的运行速度将是 double 的两倍argsort,因为创建和填充的时间rev_argsort与第一个的相比可以忽略不计argsort。