一、概述
np.argsort是numpy模塊中的一個函數,可返回一維數組中元素排序後的下標。該函數返回的是排序後各元素相對於原數組的下標值,並且數組元素值不變。
二、基本語法
np.argsort有三個參數:
numpy.argsort(a, axis=-1, kind='quicksort', order=None)
a表示需要排序的數組,axis表示排序的方向(默認-1,即從最後一個維度開始排序),kind表示使用的排序算法(默認是快速排序),order表示按照某一列排序(用於結構體做比較)。
舉個例子:
import numpy as np
a = np.array([3, 1, 4, 2])
idx = np.argsort(a)
print(idx)
輸出結果為:array([1, 3, 0, 2], dtype=int64)
說明原數組中第1個元素(1)排在第一個,第3個元素(2)排在第二個,第0個元素(3)排在第三個,第2個元素(4)排在第四個。
三、多個數組排序
可以使用argsort對多個數組排序,只需將多個數組組合成一個元組,然後將這個元組作為一個參數傳給argsort即可:
import numpy as np
x = np.array([3, 1, 4, 2])
y = np.array([5, 7, 6, 8])
idx = np.argsort((x, y))
print(idx)
輸出結果為:array([1, 3, 0, 2], dtype=int64)
說明兩個數組按照x的排序順序排序,這是它們的聯合排序順序。
四、逆序排序
默認情況下,np.argsort函數執行的是升序排序。如果想按降序排序,在調用np.argsort函數時,可將需要排序的數組加上一個負號,並指定axis參數(不能是None)。
import numpy as np
a = np.array([3, 1, 4, 2])
idx = np.argsort(-a, axis=0)
print(idx)
輸出結果為:array([2, 0, 3, 1], dtype=int64)
說明原數組中第2個元素(4)排在第一個,第0個元素(3)排在第二個,第3個元素(2)排在第三個,第1個元素(1)排在第四個。
五、實戰應用:排序並獲取對應原下標
有時候需要將原數組的下標和按下標排序後的結果一起輸出。這時仍然可以使用np.argsort函數,然後對結果應用相應的矩陣計算即可。
import numpy as np
a = np.array([3, 1, 4, 2])
idx = np.argsort(a)
print(idx)
print(idx.argsort())
print(np.arange(len(idx)))
sort_idx = np.argsort(idx)
print(sort_idx)
print(sort_idx.argsort())
輸出結果為:
[1 3 0 2]
[2 0 3 1]
[0 1 2 3]
[1 3 0 2]
[2 0 3 1]
從輸出結果可以看出,idx.argsort()等同於np.arange(len(idx)),這是因為argsort返回的是排序後原下標的順序,這樣再應用一次argsort就可以得到原下標了,即sort_idx=argsort(argsort(idx)),然後再對sort_idx排序就可以得到最終結果。
六、總結
在numpy中,np.argsort是非常常用的排序函數,掌握該函數的使用方法和注意事項對於numpy編程非常重要。尤其是在需要對多個數組進行排序、降序排序、重組原數組的下標等操作時,np.argsort起到了非常重要的作用。
原創文章,作者:JOUW,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/131412.html