您的位置:

深入解析numpy中的np.argsort()

一、排序算法

排序算法是计算机科学中的基本问题之一,其目的是将无序的数据序列按照特定的规则进行排序。numpy中的np.argsort()方法返回一个数组的升序排列的下标,即按照元素大小返回对应的下标值,而不是元素的值本身。

numpy中实现排序主要有两种算法:快速排序和归并排序。其中快速排序运用递归的思想,将大数组分割成小数组,通过不断划分子数组来实现排序。归并排序则是将数据分成两个部分,分别排序再使用归并算法合并。


import numpy as np

arr = np.array([3, 7, 1, 4, 2])
idxs = np.argsort(arr)
print(idxs)   # [2 4 0 3 1]

二、返回不同的数据类型

np.argsort()返回排序数组的下标值,可以通过传入不同的参数,实现返回不同的数据类型:

  • axis : 沿着行或列进行排序。默认为-1,表示沿着最后一个轴。
  • kind : 指定排序算法,支持5种算法选择。{'quicksort', 'mergesort', 'heapsort', 'stable'}
  • order : 当数组为结构类型时,可以指定用于排序的字段。默认为None。

arr = np.array([[3, 2], [5, 0]])
idx1 = np.argsort(arr, axis=0)
idx2 = np.argsort(arr, axis=1)
print(idx1)  # [[0 1][1 0]]
print(idx2)  # [[1 0][1 0]]

三、多字段排序

有时候需要按照多个字段进行排序,比如按照年龄和身高进行排序。这时候可以使用numpy结构体的方式进行处理,然后再对结果按照特定的顺序排序。如下所示:


dtype = [("name", "S10"), ("age", int), ("height", float)]
values = [("Tom", 25, 172.2), ("Jerry", 32, 165.3), ("Lucy", 33, 158.1)]
arr = np.array(values, dtype=dtype)
idx = np.argsort(arr, order=("age", "height"))
print(idx)

四、稳定排序

numpy中的排序算法都是稳定的,即相同元素的相对位置在排序前后不变,这在实际应用中非常重要。比如需要对一组大小相同但却具有不同意义的数据进行排序,如果排序算法不稳定,则可能会打乱其原有的相对位置。

在实际场景中,稳定排序的一个典型应用场景就是在截取数据时,需要保证顺序的连续性,如前K大问题,其中顺序也是非常重要的。

五、总结

numpy中的np.argsort()功能强大且灵活,可用于数组排序以及一些高级排序应用场景。

它支持多种排序算法,返回不同的数据类型,同时还可以用于多字段排序,且保证排序结果的稳定性。