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("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]

使用花式索引排序数组

使用花式索引排序数组涉及首先创建一个表示所需元素顺序的索引数组。然后,这些索引用于根据特定标准重新排序数组元素。

花式索引提供了一种执行高级排序操作的方法,这些操作超越了简单的就地排序。

示例

在这个例子中,我们使用 np.argsort() 函数检索将对数组 “arr” 进行排序的索引。然后使用这些索引将 “arr” 重新排列成一个排序后的数组 -

import numpy as np

arr = np.array([3, 1, 4, 1, 5, 9])
# Get indices that would sort the array
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]

多维数组的花式索引

在多维数组中,花式索引可以应用于沿特定轴重新排序或选择元素。

通过使用索引数组,您可以实现各种操作,例如排序元素、重新排列行或列以及提取特定数据点。

示例:二维数组中的花式索引

在下面的示例中,我们使用花式索引重新排序二维数组的行和列。通过指定 “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]]

示例:三维数组中的花式索引

在三维数组中,花式索引可用于重新排序第一个轴上的切片。在这里,通过指定 “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() 函数,我们获得重新排序数组的索引,从而得到一个按年龄排序的新数组 -

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