2015-02-17 100 views
2

numpy的argsort函數返回排序列表的原始索引。 現在我需要原始列表的排序列表的索引。有沒有 一個功能或一個優雅的方式來做到這一點?如何獲取Python中原始列表的排序列表的索引?

例如:

>>> 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

你可以隨時撥打argsort兩次:

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

據我所知,有沒有 「雙argsort」 在NumPy的可用功能,但應用argsort兩次到數組是計算值的排列的常用方法(參見here)。

+0

一個明智的解決方案! – gerry 2015-02-18 00:07:36

2

雖然雙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的linearithmic複雜。實際上,這意味着,對於足夠大的陣列,上述代碼將運行兩倍於雙重argsort,因爲創建和填充rev_argsort的時間與第一個argsort的時間相比可以忽略不計。

+0

我同意。使用賦值而不是排序是一個更合理的解決方案。感謝您指出! – gerry 2015-02-18 01:15:08