深入探索np.argsort的各个细节

发布时间:2023-05-19

一、概述

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 起到了非常重要的作用。