NumPy - 数组排序



NumPy 中的数组排序

在 NumPy 中,排序指的是按特定顺序(通常是升序或降序)排列数组元素的过程。

NumPy 提供了几个执行排序操作的函数,这些函数可以应用于一维和多维数组。它们如下所示:

  • sort() 函数
  • partition() 函数
  • argsort() 函数
  • lexsort() 函数

使用 np.sort() 函数

np.sort() 函数对数组的元素进行排序,并返回一个包含排序后元素的新数组。除非使用 "ndarray" 对象的 sort() 函数就地排序,否则原始数组保持不变。

排序可以沿着指定的轴进行,如果未指定轴,则函数默认为沿着最后一个轴排序。以下是语法:

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

其中,

  • a: 要排序的数组。
  • axis: 要排序的轴。默认为 -1,表示沿着最后一个轴排序。
  • kind: 要使用的排序算法。选项包括 'quicksort'、'mergesort'、'heapsort' 和 'stable'。
  • order: 在对结构化数组排序时使用,用于定义要比较的字段。

示例

在下面的示例中,我们使用 np.sort() 函数按升序对给定数组进行排序:

import numpy as np

arr = np.array([3, 1, 2, 5, 4])
sorted_arr = np.sort(arr)

print("Original Array:", arr)
print("Sorted Array:", sorted_arr)

获得以下输出:

Original Array: [3 1 2 5 4]
Sorted Array: [1 2 3 4 5]

NumPy 中的就地排序

就地排序是一种直接在原始数组上执行排序操作的方式,修改其顺序(默认情况下为升序),而无需创建单独的排序副本。

在 NumPy 中,我们可以使用 ndarray 对象的 sort() 函数执行就地排序。以下是语法:

ndarray.sort(axis=-1, kind=None, order=None)

示例

在这个例子中,我们使用 arr.sort() 函数对给定数组进行就地排序,修改原始数组:

import numpy as np

arr = np.array([3, 1, 2, 5, 4])
arr.sort()
print("In-Place Sorted Array:", arr)

这将产生以下结果:

In-Place Sorted Array: [1 2 3 4 5]

沿特定轴排序

NumPy 允许在多维数组中沿特定轴排序元素。它可以帮助您以尊重数组结构的方式组织数据,无论这是否涉及排序行、列或更高维度的切片。

我们可以使用 np.sort() 函数的 axis 参数在 Numpy 中沿特定轴排序元素:

  • 轴 0: 在二维数组中表示行(向下方向)。沿轴 0 排序会独立地对每一列进行排序。
  • 轴 1: 在二维数组中表示列(水平方向)。沿轴 1 排序会独立地对每一行进行排序。
  • 更高维度: 在超过两个维度的数组中,轴 2、3 等对应于更高维度的切片。

示例

在下面的示例中,我们沿两个不同的轴对二维 NumPy 数组进行排序:轴 0(列)和轴 1(行):

import numpy as np

arr = np.array([[3, 2, 1], [6, 5, 4]])
sorted_arr_axis0 = np.sort(arr, axis=0)
sorted_arr_axis1 = np.sort(arr, axis=1)

print("Original Array:\n", arr)
print("Sorted Along Axis 0:\n", sorted_arr_axis0)
print("Sorted Along Axis 1:\n", sorted_arr_axis1)

以上代码的输出如下:

Original Array:
[[3 2 1]
 [6 5 4]]
Sorted Along Axis 0:
[[3 2 1]
 [6 5 4]]
Sorted Along Axis 1:
[[1 2 3]
 [4 5 6]] 

使用 partition() 函数进行部分排序

NumPy 中的 np.partition() 函数用于重新排序数组中的元素,使得所有小于指定元素(称为“第 k 个元素”)的元素都移动到它之前,所有大于“第 k 个元素”的元素都移动到它之后。

当您需要在不完全排序的情况下查找数组中第 k 个最小或最大元素时,此函数非常有用。以下是语法:

numpy.partition(a, kth, axis=-1, kind='introselect', order=None)

其中,

  • a: 您要分区的数组。
  • kth: 我们需要围绕其对数组进行分区的元素的索引。它可以是整数或整数序列。
  • axis: 要对数组进行分区的轴。默认情况下,它设置为 -1,表示最后一个轴。
  • kind: 要使用的选择算法。默认为 'introselect',它是快速选择和中位数的中位数的混合体。
  • order: 用于复杂数据类型,用于指定要排序的字段。

示例

在此示例中,数组被分区,使得索引 2 处的元素被定位,所有在其之前的元素都小于或等于它,所有在其之后的元素都大于或等于它:

import numpy as np

arr = np.array([3, 1, 2, 5, 4])
partitioned_arr = np.partition(arr, 2)

print("Partitioned Array:", partitioned_arr)

获得的输出如下所示:

Partitioned Array: [1 2 3 5 4]

使用 argsort() 函数进行间接排序

NumPy 中的 np.argsort() 函数用于获取将对数组进行排序的索引。np.argsort() 函数不会返回排序后的数组本身,而是返回一个索引数组,表示应按什么顺序排列元素才能获得排序后的数组。

当您需要根据另一个数组的排序顺序对一个数组进行排序时,此函数非常有用。以下是语法:

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

其中,

  • a: 您要排序的数组。
  • axis: 要排序的轴。默认情况下,它设置为 -1,表示最后一个轴。
  • kind: 要使用的排序算法。选项包括 'quicksort'、'mergesort'、'heapsort' 和 'stable'。默认为 'quicksort'。
  • order: 用于复杂数据类型,用于指定要排序的字段。

示例

在下面的示例中,我们使用 np.argsort() 函数获取将对数组 "arr" 进行排序的索引。然后,我们使用这些索引将原始数组重新排列为其排序顺序:

import numpy as np

arr = np.array([3, 1, 2, 5, 4])
sorted_indices = np.argsort(arr)

print("Indices that would sort the array:", sorted_indices)
print("Sorted Array Using Indices:", arr[sorted_indices])

执行以上代码后,我们得到以下输出:

Indices that would sort the array: [1 2 0 4 3]
Sorted Array Using Indices: [1 2 3 4 5]

排序结构化数组

NumPy 中的结构化数组允许您创建数组,其中每个元素可以有多个字段,每个字段都有自己的数据类型。这类似于数据库表或传统编程语言中的记录,其中每个条目可以保存多种类型的数据。

您可以根据一个或多个字段对结构化数组进行排序。当您想根据特定条件对记录进行排序时,这很有用。为此,您可以使用 NumPy 中的 np.sort() 函数,该函数接受一个 order 参数来指定要排序的字段。

示例

在下面的示例中,我们根据 'age' 字段对结构化数组 "arr" 进行排序:

import numpy as np

arr = np.array([('John', 25), ('Alice', 30), ('Bob', 22)],
               dtype=[('name', 'U10'), ('age', 'i4')])
sorted_arr = np.sort(arr, order='age')

print("Sorted Structured Array:\n", sorted_arr)

产生的结果如下:

Sorted Structured Array:
[('Bob', 22) ('John', 25) ('Alice', 30)]

使用 lexsort() 函数进行字典序排序

np.lexsort() 函数使用一系列键执行间接排序。它获取一系列字段或列,并返回一个索引数组,该数组将根据这些键对输入数组进行排序。

numpy.lexsort(keys, axis=-1)

其中,

  • keys: 数组序列或单个数组,其中每个数组表示一个用于排序的键。键按提供的顺序排序,这意味着序列中的最后一个键是主键,倒数第二个键是次键,依此类推。
  • axis: 要排序的轴。默认情况下,它设置为 -1,表示最后一个轴。

示例

在此示例中,np.lexsort() 函数用于首先根据名称对数组进行排序,如果名称相同,则按年龄排序。排序顺序基于字典序比较:

import numpy as np

names = np.array(['John', 'Alice', 'Bob'])
ages = np.array([25, 30, 22])
sorted_indices = np.lexsort((ages, names))

print("Indices for Lexicographical Sort:", sorted_indices)
print("Sorted Names and Ages:", names[sorted_indices], ages[sorted_indices])

我们得到如下所示的输出:

Indices for Lexicographical Sort: [1 2 0]
Sorted Names and Ages: ['Alice' 'Bob' 'John'] [30 22 25]
广告