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