簡體   English   中英

MATLAB sort() vs Numpy argsort() - 如何匹配結果?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM