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