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