[英]How to sort a list based on the output of numpy's argsort function
[英]MATLAB sort() vs Numpy argsort() - how to match results?
我正在將 MATLAB 代碼移植到 Python 的 Numpy。
在 MATLAB(實際上是 Octave)中,我有類似的東西:
>> someArr = [9, 8, 7, 7]
>> [~, ans] = sort(someArr, 'descend')
ans =
1 2 3 4
所以在 Numpy 我正在做:
>>> someArr = np.array([9, 8, 7, 7])
>>> np.argsort(someArr)[::-1]
array([0, 1, 3, 2])
我在 MATLAB 中得到1, 2, 3, 4
而在 Numpy 上得到0, 1, 3, 2
,而我在 Numpy 上需要0, 1, 2, 3
。
我相信這是由於每個函數中使用的排序算法,但我檢查過,看起來兩者都在使用“快速排序”(參見此處和此處)。
如何將 Numpy 的解決方案與 MATLAB 的解決方案相匹配?
為了使這項工作有效,我們需要稍微聰明一點。 numpy
沒有'descend'
類似物。 您通過反轉排序結果來模仿它(最終您要撤消操作)。
我不確定matlab
如何完成它,但是他們聲稱使用了quicksort的穩定變體 。 具體來說,對於降序排序:
如果標志為“下降”,則在返回輸出之前將其反轉。 反轉之后,我們對索引向量進行了排序以恢復穩定性。
octave
似乎在這里也一樣。
由於它們的排序是穩定的,因此可以保證輸入中相等值的順序將保留在輸出中。 另一方面, numpy
對其numpy
並沒有這樣的保證。 如果我們想在numpy中進行穩定排序,則需要使用mergesort
:
>>> np.argsort(someArr, kind='mergesort')
array([2, 3, 1, 0])
好的,此輸出很有意義。 someArr[2] == someArr[3]
並且第三個元素在第四個元素之前,因此明智的做法是在輸出中2
會在3
之前(如果沒有保證的穩定排序算法,我們無法提出此主張)。 現在是明智的一步……您想要“降序”值,而不是反轉argsort
的輸出,為什么不argsort
反呢? 與降序排序相比,這將產生比低序排序更大的數字排序的效果...
>>> np.argsort(-someArr, kind='quicksort')
array([0, 1, 2, 3])
現在我們在說話! 而且由於可以保證mergesort是穩定的,因此出現在較低索引處的元素(具有相等值)將首先出現在輸出中-就像matlab / octave一樣。 真好
您可以選擇不同的排序算法。 將其更改為heapsort
對我heapsort
:
>> np.argsort(someArr, kind="heapsort")[::-1]
array([0, 1, 2, 3], dtype=int32)
編輯:這僅適用於我看過的幾個測試用例。 對於[9, 8, 7, 7, 4, 1, 1]
它停止工作。 我的答案可能不是一個好的解決方案。
np.argsort(dataset,axis=-1,kind='stable')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.