Numpy之numpy.argsort()

Numpy之numpy.argsort()

前言

關於argsort這個函數一直沒有很好的理解,今天算是搞明白了。特此記錄。

介紹

函數原型:

numpy.argsort(a, axis=-1, kind=None, order=None)

理解這個函數的關鍵在於明白其返回的是什麼

首先明確,對於numpy的數組輸出的形式上,橫向始終表示的是最後一維的方向axis=-1)。對於二維的數據a(np.ndim(a)=2),axis=0表示列的方向,也就是從上到下的方向;axis=1表示行的方向,也就是從左到右的方向。

它的返回值表示這麼幾點:

  1. 返回值中的元素表示原始數據的索引(也就是位置),直接返回排序後的結果可以使用numpy.sort()
  2. 返回值中的元素的位置順序表示了真實數據的從小到大的排序順序
  3. 返回值中的元素對應於元素值表示的索引上按照指定軸(方向)的原始數據

可以分析下面幾個例子加深理解。

a
array([[0.3451194 , 0.32197821, 0.23369311],
       [0.57426324, 0.03603039, 0.46324327],
       [0.73053454, 0.25336478, 0.59913947],
       [0.47781611, 0.79507359, 0.11370495]])
# 沿着列排序,也就是沿着維度axis=0方向上排序
np.argsort(a, axis=0)
array([[0, 1, 3],
       [3, 2, 0],
       [1, 0, 1],
       [2, 3, 2]])
# 沿着行排序,也就是沿着維度axis=1方向上排序
np.argsort(a, axis=1)
array([[2, 1, 0],
       [1, 2, 0],
       [1, 2, 0],
       [2, 0, 1]])

可以看出來,對於numpy數組a而言,使用了np.argsort()後的返回結果,axis決定了排序針對的數據。

對於np.argsort(a, axis=0)的輸出的[1, 0]位置的值3

  1. 表示這個位置應該放置原始數據沿着axis=0方向上(列向)的座標值爲3的數據
  2. 也就是a[3, 0] = 0.4778161084937589
  3. 也即是[1, 0] => 3 => [3, 0] ==>> 排序後位置[1, 0]上的值爲a[3, 0]

根據numpy文檔的例子中可以看到,根據得到的索引是可以得到最終的排序結果的:

ind = np.argsort(a, axis=0)
ind
array([[0, 1, 3],
       [3, 2, 0],
       [1, 0, 1],
       [2, 3, 2]])
np.take_along_axis(a, ind, axis=0)
array([[0.3451194 , 0.03603039, 0.11370495],
       [0.47781611, 0.25336478, 0.23369311],
       [0.57426324, 0.32197821, 0.46324327],
       [0.73053454, 0.79507359, 0.59913947]])

這裏使用np.take_along_axis()得到的結果和直接使用np.sort()效果是一樣的。

np.sort(a, axis=0)
array([[0.3451194 , 0.03603039, 0.11370495],
       [0.47781611, 0.25336478, 0.23369311],
       [0.57426324, 0.32197821, 0.46324327],
       [0.73053454, 0.79507359, 0.59913947]])

參考資料

  • https://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html
  • argsort()函數的總結:https://blog.csdn.net/u014745194/article/details/73496836
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章