NumPy - 使用花式索引进行排序
在 NumPy 中使用花式索引进行排序
在 NumPy 中使用花式索引进行排序涉及使用一个索引数组重新排列另一个数组中的元素。花式索引允许您根据特定索引对数组进行排序或重新排序,从而更好地控制数据的组织方式。
例如,您可以先使用 argsort() 函数确定元素的顺序,然后使用这些索引对原始数组进行排序。这对于需要精确控制元素顺序的复杂数据操作任务非常有用。
基本花式索引
基本花式索引涉及使用一个或多个索引数组从 NumPy 数组中选择元素。这些索引可以是整数或布尔值数组,从而允许非连续地选择元素。这对于重新排序或同时选择多个元素尤其有用。
示例
在下面的示例中,我们使用花式索引根据指定的一组索引对数组进行重新排序。通过使用"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("原始数组:", arr)
print("使用特殊索引后的排序数组:", sorted_arr)
以下是得到的输出 -
原始数组:[10 20 30 40 50] 使用特殊索引后的排序数组:[50 30 40 20 10]
使用花式索引对数组进行排序
使用花式索引对数组进行排序,首先需要创建一个索引数组,该数组表示元素所需的顺序。然后,这些索引将根据特定条件对数组元素进行重新排序。
花式索引提供了一种执行高级排序操作的方法,这种操作超越了简单的就地排序。
示例
在此示例中,我们使用 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("原始数组:", arr)
print("排序后的数组:", sorted_arr)
这将产生以下结果 -
原始数组:[3 1 4 1 5 9] 排序后的数组:[1 1 3 4 5 9]
使用多维数组进行花式索引数组
在多维数组中,可以使用花式索引沿特定轴重新排序或选择元素。
通过使用索引数组,您可以实现各种操作,例如对元素进行排序、重新排列行或列以及提取特定数据点。
示例:二维数组中的花式索引
在下面的示例中,我们使用花式索引对二维数组的行和列进行重新排序。通过指定"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])
# 重新排序行和列
reordered_arr = arr[row_indices][:, col_indices]
print("原始数组:
", arr)
print("重新排序后的数组:
", reordered_arr)
以下是上述代码的输出−
原始数组: [[10 20 30] [40 50 60]] 重新排序后的数组: [[60 50 40] [30 20 10]]
示例:三维数组中的花式索引
在三维数组中,花式索引可用于沿第一个轴重新排序切片。在这里,通过指定"slice_indices",我们重新排列数组切片,生成一个包含重新排序切片的新数组 -
import numpy as np
# 定义一个形状为 (3, 2, 2) 的 3D NumPy 数组
arr = np.array([[[1, 2], [3, 4]],
[[5, 6], [7, 8]],
[[9, 10], [11, 12]]])
# 定义一个索引数组,用于沿第一个轴重新排序切片
slice_indices = np.array([2, 0, 1])
# 使用花式索引重新排序切片
reordered_slices = arr[slice_indices]
print("原始数组:
", arr)
print("重新排序后的切片:
", reordered_slices)
输出结果如下 -
原始数组: [[[ 1 2] [ 3 4]] [[ 5 6] [ 7 8]] [[ 9 10] [11 12]]] 重新排序后的切片: [[[ 9 10] [11 12]] [[ 1 2] [ 3 4]] [[ 5 6] [ 7 8]]]
使用花式索引和结构化数组进行排序
花式索引也可以应用于结构化数组,您可以根据特定字段的值进行排序。
结构化数组NumPy 中的数组包含复合数据类型,每个元素可以包含多个不同数据类型的字段。这对于在单个数组中管理异构数据非常有用。
示例
在以下示例中,我们将根据"年龄"字段对结构化 NumPy 数组进行排序。通过对 age 字段使用 np.argsort() 函数,我们获取了对数组进行重新排序的索引,从而生成一个按年龄排序的新数组 -
import numpy as np
dtype = [('name', 'S10'), ('age', 'i4')]
values = [('Alice', 25), ('Bob', 30), ('Charlie', 20)]
arr = np.array(values, dtype=dtype)
# 按年龄排序
sorted_indices = np.argsort(arr['age'])
sorted_arr = arr[sorted_indices]
print("原始结构化数组:
", arr)
print("按年龄排序:
", sorted_arr)
我们得到如下所示的输出 -
原始结构化数组: [(b'Alice', 25) (b'Bob', 30) (b'Charlie', 20)] 按年龄排序: [(b'Charlie', 20) (b'Alice', 25) (b'Bob', 30)]

