NumPy - 使用 Fancy Indexing 进行排序
NumPy 中的 Fancy Indexing 排序
NumPy 中的 fancy indexing 排序涉及使用一个索引数组来重新排列另一个数组中的元素。Fancy indexing 允许您根据特定索引对数组进行排序或重新排序,从而对数据的组织方式提供更多控制。
例如,您可以先使用 argsort() 函数确定元素的顺序,然后使用这些索引对原始数组进行排序。这对于需要精确控制元素顺序的复杂数据操作任务非常有用。
基本 Fancy Indexing
基本 fancy indexing 涉及使用一个或多个索引数组从 NumPy 数组中选择元素。这些索引可以是整数数组或布尔值数组,允许非连续选择元素。这对于同时重新排序或选择多个元素特别有用。
示例
在以下示例中,我们使用 fancy indexing 根据指定的索引集重新排序数组。通过使用 “indices” 数组索引 “arr”,我们得到一个新数组,其中元素按照给定的顺序排列 −
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
indices = np.array([4, 2, 3, 1, 0])
sorted_arr = arr[indices]
print("Original Array:", arr)
print("Sorted Array with Fancy Indexing:", sorted_arr)
以下是得到的结果 −
Original Array: [10 20 30 40 50] Sorted Array with Fancy Indexing: [50 30 40 20 10]
使用 Fancy Indexing 排序数组
使用 fancy indexing 排序数组首先涉及创建一个表示所需元素顺序的索引数组。然后使用这些索引根据特定标准重新排列数组元素。
Fancy indexing 提供了一种执行高级排序操作的方法,超越了简单的原地排序。
示例
在这个示例中,我们使用 np.argsort() 函数获取将数组 “arr” 排序所需的索引。然后使用这些索引将 “arr” 重新排列成一个已排序的数组 −
import numpy as np
arr = np.array([3, 1, 4, 1, 5, 9])
# 获取将数组排序所需的索引
sort_order = np.argsort(arr)
sorted_arr = arr[sort_order]
print("Original Array:", arr)
print("Sorted Array:", sorted_arr)
这将产生以下结果 −
Original Array: [3 1 4 1 5 9] Sorted Array: [1 1 3 4 5 9]
多维数组的花式索引
在多维数组中,花式索引可以用来沿特定轴重新排序或选择元素。
通过使用索引数组,你可以实现各种操作,例如排序元素、重排行或列,以及提取特定数据点。
示例:2D 数组中的花式索引
在下面的示例中,我们使用花式索引重新排序 2D 数组的行和列。通过指定 "row_indices" 和 "col_indices",我们重排数组的行和列,生成一个新的重排序数组 −
import numpy as np
arr = np.array([[10, 20, 30], [40, 50, 60]])
row_indices = np.array([1, 0])
col_indices = np.array([2, 1, 0])
# Reorder rows and columns
reordered_arr = arr[row_indices][:, col_indices]
print("Original Array:\n", arr)
print("Reordered Array:\n", reordered_arr)
以上代码的输出如下 −
Original Array: [[10 20 30] [40 50 60]] Reordered Array: [[60 50 40] [30 20 10]]
示例:3D 数组中的花式索引
在 3D 数组中,花式索引可以用来沿第一个轴重新排序切片。这里,通过指定 "slice_indices",我们重排数组的切片,生成一个具有重排序切片的新数组 −
import numpy as np
# Define a 3D NumPy array with shape (3, 2, 2)
arr = np.array([[[1, 2], [3, 4]],
[[5, 6], [7, 8]],
[[9, 10], [11, 12]]])
# Define an array of indices to reorder slices along the first axis
slice_indices = np.array([2, 0, 1])
# Reorder the slices using fancy indexing
reordered_slices = arr[slice_indices]
print("Original Array:\n", arr)
print("Reordered Slices:\n", reordered_slices)
得到的输出如下所示 −
Original Array: [[[ 1 2] [ 3 4]] [[ 5 6] [ 7 8]] [[ 9 10] [11 12]]] Reordered Slices: [[[ 9 10] [11 12]] [[ 1 2] [ 3 4]] [[ 5 6] [ 7 8]]]
使用花式索引和结构化数组进行排序
花式索引也可以应用于结构化数组,其中可以基于特定字段的值进行排序。
NumPy 中的结构化数组是具有复合数据类型的数组,每个元素可以有多个不同数据类型的字段。这些数组适用于在单个数组中管理异构数据。
示例
在以下示例中,我们基于 "age" 字段对结构化 NumPy 数组进行排序。通过在 age 字段上使用 np.argsort() function,我们获得用于重排序数组的索引,从而生成一个按年龄排序的新数组 −
import numpy as np
dtype = [('name', 'S10'), ('age', 'i4')]
values = [('Alice', 25), ('Bob', 30), ('Charlie', 20)]
arr = np.array(values, dtype=dtype)
# Sort by age
sorted_indices = np.argsort(arr['age'])
sorted_arr = arr[sorted_indices]
print("Original Structured Array:\n", arr)
print("Sorted by Age:\n", sorted_arr)
我们得到的输出如下所示 −
Original Structured Array: [(b'Alice', 25) (b'Bob', 30) (b'Charlie', 20)] Sorted by Age: [(b'Charlie', 20) (b'Alice', 25) (b'Bob', 30)]