NumPy 花式索引怎么排序数组?

文章导读
Previous Quiz Next NumPy 中的 Fancy Indexing 排序 NumPy 中的 fancy indexing 排序涉及使用一个索引数组来重新排列另一个数组中的元素。Fancy indexing 允许您根据特定索引对数组进行排序或重新排序,从而对
📋 目录
  1. NumPy 中的 Fancy Indexing 排序
  2. 基本 Fancy Indexing
  3. 使用 Fancy Indexing 排序数组
  4. 多维数组的花式索引
  5. 使用花式索引和结构化数组进行排序
A A

NumPy - 使用 Fancy Indexing 进行排序



Previous
Quiz
Next

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)]