簡體   English   中英

獲取列表升序的索引

[英]Getting indices of ascending order of list

我知道這個問題已經問了一百次了,但答案似乎總是“使用 numpy 的 argsort”。 但是,要么我誤解了大多數人的要求,要么問題的答案不正確。 無論如何,我希望獲得列表升序的索引。 措辭令人困惑,因此舉個例子,給定一個列表[4, 2, 1, 3]我希望得到一個列表[3, 1, 0, 2] 最小的項是1 ,因此它的索引為0 ,最大的項是4因此它的索引為3 在我看來, argsort經常被建議,但它似乎並沒有這樣做。

from numpy import argsort

l = [4, 2, 1, 3]
print(argsort(l))
# [2, 1, 3, 0]
# Expected [3, 1, 0, 2]

很明顯 argsort 正在做其他事情,那么它實際上在做什么,它與預期的行為有何相似之處,以至於經常(錯誤地)提出建議? 而且,更重要的是,我怎樣才能獲得所需的輸出?

argsoft()基本上是將您的列表轉換為索引的排序列表。

l = [4, 2, 1, 3]

首先它獲取列表中每個元素的索引,因此新列表變為:

indexed=[0, 1, 2, 3]

然后它根據原始列表中的項目對索引列表進行排序。 4:0 , 2:1 , 1:2 and 3:3其中 : 表示“對應於”。

對我們得到的原始列表進行排序

l=[1, 2, 3, 4]

並放置舊列表的每個對應索引的值

new=[2,1,3,0]

所以基本上它根據原始列表對列表的索引進行排序。 據我所知,這是。 對不起,如果我錯了。

您沒有得到“正確”或預期的答案的原因是因為您問錯了問題!

您所追求的是排序后的元素排名,而 Numpy 的 argsort() 返回已排序的索引列表,如文檔所示!。 這些不是一回事(正如您所發現的;))!

@hpaulj 正確回答了我,但在評論中。 而且你看不見他。 他的回答對我幫助很大,它讓我得到了我想要的。

import numpy as np
l = [4, 2, 1, 3]
print(np.argsort(np.argsort(l)))

返回:

[3, 1, 0, 2]

這就是你所期望的。 如果數組已排序,則此方法返回數組的索引。

⚠️ 但請注意,如果輸入數組包含重復,則有一個有趣的效果:

import numpy as np
l = [4, 2, 1, 3, 4]
print(np.argsort(np.argsort(l)))

返回:

[3 1 0 2 4]

他可能不會傷害你,但他確實傷害了我。 我這樣解決這個問題:

import numpy as np

l = [4, 2, 1, 3, 4]

ret2 = np.vectorize(lambda val: np.searchsorted(np.unique(l), val))(l)

print('Returned', ret2)
print('Expected', [3, 1, 0, 2, 3])

返回:

Returned [3 1 0 2 3]
Expected [3, 1, 0, 2, 3]

確實,由於vectorize功能,我的解決方案會很慢。 但是沒有什么可以阻止您使用numba 不過我還沒有測試過😉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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