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])
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])
你可以隨時撥打argsort
兩次:
>>> a.argsort().argsort()
array([0, 3, 1, 2])
據我所知,有沒有 「雙argsort」 在NumPy的可用功能,但應用argsort
兩次到數組是計算值的排列的常用方法(參見here)。
雖然雙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
的時間相比可以忽略不計。
我同意。使用賦值而不是排序是一個更合理的解決方案。感謝您指出! – gerry 2015-02-18 01:15:08
一個明智的解決方案! – gerry 2015-02-18 00:07:36