您的位置:

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

一、概述

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