NumPy 函数

NumPy argsort() 函数返回对数组进行排序的索引。

语法

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

参数

a必填。 指定要排序的数组。
axis可选。 指定排序的轴。如果没有,则在排序之前将数组展平。默认值为 -1,沿最后一个轴排序。
kind可选。 指定排序算法。它可以从 {'quicksort', 'mergesort', 'heapsort', 'stable'} 中获取值。默认值:"快速排序"
order可选。 指定包含字段的字符串或字符串列表。当a是定义了字段的数组时,该参数指定需要比较的字段的顺序。

返回值

返回沿指定轴对 a 进行排序的索引数组。如果 a 是一维的,则 a[index_array] 会生成排序后的 a。更一般而言,np.take_along_axis(a, index_array, axis=axis) 始终生成排序的 a,无论维数如何。

示例:

在下面的示例中,argsort() 函数用于获取索引,该索引进一步用于生成排序后的数组。

import numpy as np
Arr = np.array([50, 40, 10, 60, 30, 20])

#显示数组
print("原始数组:")
print(Arr)

#从 argsort() 获取索引
x = np.argsort(Arr)
print("\nIndices from argsort():")
print(x)

#产生排序数组
print("\n排序数组:")
print(Arr[x]) 

上面的代码将是:

原始数组:
[50 40 10 60 30 20]

Indices from argsort():
[2 5 4 1 0 3]

排序数组:
[10 20 30 40 50 60] 

示例:使用 axis 参数

axis 参数可用于获取将排序的索引沿给定轴的数组,如下例所示:

import numpy as np
Arr = np.array([[40,10],
                [20,50]])

#显示数组
print("原始数组:")
print(Arr)

#产生沿轴排序的数组=0
x = np.argsort(Arr, axis=0)
print("\nSorted array along axis=0:")
print(np.take_along_axis(Arr, x, axis=0))

#产生沿轴排序的数组=1
y = np.argsort(Arr, axis=1)
print("\nSorted array along axis=1:")
print(np.take_along_axis(Arr, y, axis=1)) 

上述代码的输出将是:

原始数组:
[[40 10]
 [20 50]]

Sorted array along axis=0:
[[20 10]
 [40 50]]

Sorted array along axis=1:
[[10 40]
 [20 50]] 

示例:使用order参数

order参数可用于指定哪个字段需要先排序。考虑下面的示例:

import numpy as np
Arr = np.array([(20,60),
                (20,50),
                (20,55),
                (10,75),
                (10,25),
                (10,50)], 
                dtype=[('x', '<i4'), ('y', '<i4')])

#显示数组
print("原始数组:")
print(Arr)

#产生排序数组
indices = np.argsort(Arr, order=('x','y') )
print("\n排序数组:")
print(Arr[indices]) 

上述代码的输出将是:

原始数组:
[(20, 60) (20, 50) (20, 55) (10, 75) (10, 25) (10, 50)]

排序数组:
[(10, 25) (10, 50) (10, 75) (20, 50) (20, 55) (20, 60)]