NumPy - 陣列排序



NumPy 中的陣列排序

在 NumPy 中,排序指的是按特定順序(通常是升序或降序)排列陣列元素的過程。

NumPy 提供了幾個執行排序操作的函式,這些函式可以應用於一維和多維陣列。它們如下所示:

  • sort() 函式
  • partition() 函式
  • argsort() 函式
  • lexsort() 函式

使用 np.sort() 函式

np.sort() 函式對陣列的元素進行排序,並返回一個包含排序後元素的新陣列。除非使用 "ndarray" 物件的 sort() 函式就地排序,否則原始陣列保持不變。

排序可以沿著指定的軸進行,如果未指定軸,則函式預設為沿著最後一個軸排序。以下是語法:

numpy.sort(a, axis=-1, kind=None, order=None)

其中,

  • a: 要排序的陣列。
  • axis: 要排序的軸。預設為 -1,表示沿著最後一個軸排序。
  • kind: 要使用的排序演算法。選項包括 'quicksort'、'mergesort'、'heapsort' 和 'stable'。
  • order: 在對結構化陣列排序時使用,用於定義要比較的欄位。

示例

在下面的示例中,我們使用 np.sort() 函式按升序對給定陣列進行排序:

import numpy as np

arr = np.array([3, 1, 2, 5, 4])
sorted_arr = np.sort(arr)

print("Original Array:", arr)
print("Sorted Array:", sorted_arr)

獲得以下輸出:

Original Array: [3 1 2 5 4]
Sorted Array: [1 2 3 4 5]

NumPy 中的就地排序

就地排序是一種直接在原始陣列上執行排序操作的方式,修改其順序(預設情況下為升序),而無需建立單獨的排序副本。

在 NumPy 中,我們可以使用 ndarray 物件的 sort() 函式執行就地排序。以下是語法:

ndarray.sort(axis=-1, kind=None, order=None)

示例

在這個例子中,我們使用 arr.sort() 函式對給定陣列進行就地排序,修改原始陣列:

import numpy as np

arr = np.array([3, 1, 2, 5, 4])
arr.sort()
print("In-Place Sorted Array:", arr)

這將產生以下結果:

In-Place Sorted Array: [1 2 3 4 5]

沿特定軸排序

NumPy 允許在多維陣列中沿特定軸排序元素。它可以幫助您以尊重陣列結構的方式組織資料,無論這是否涉及排序行、列或更高維度的切片。

我們可以使用 np.sort() 函式的 axis 引數在 Numpy 中沿特定軸排序元素:

  • 軸 0: 在二維陣列中表示行(向下方向)。沿軸 0 排序會獨立地對每一列進行排序。
  • 軸 1: 在二維陣列中表示列(水平方向)。沿軸 1 排序會獨立地對每一行進行排序。
  • 更高維度: 在超過兩個維度的陣列中,軸 2、3 等對應於更高維度的切片。

示例

在下面的示例中,我們沿兩個不同的軸對二維 NumPy 陣列進行排序:軸 0(列)和軸 1(行):

import numpy as np

arr = np.array([[3, 2, 1], [6, 5, 4]])
sorted_arr_axis0 = np.sort(arr, axis=0)
sorted_arr_axis1 = np.sort(arr, axis=1)

print("Original Array:\n", arr)
print("Sorted Along Axis 0:\n", sorted_arr_axis0)
print("Sorted Along Axis 1:\n", sorted_arr_axis1)

以上程式碼的輸出如下:

Original Array:
[[3 2 1]
 [6 5 4]]
Sorted Along Axis 0:
[[3 2 1]
 [6 5 4]]
Sorted Along Axis 1:
[[1 2 3]
 [4 5 6]] 

使用 partition() 函式進行部分排序

NumPy 中的 np.partition() 函式用於重新排序陣列中的元素,使得所有小於指定元素(稱為“第 k 個元素”)的元素都移動到它之前,所有大於“第 k 個元素”的元素都移動到它之後。

當您需要在不完全排序的情況下查詢陣列中第 k 個最小或最大元素時,此函式非常有用。以下是語法:

numpy.partition(a, kth, axis=-1, kind='introselect', order=None)

其中,

  • a: 您要分割槽的陣列。
  • kth: 我們需要圍繞其對陣列進行分割槽的元素的索引。它可以是整數或整數序列。
  • axis: 要對陣列進行分割槽的軸。預設情況下,它設定為 -1,表示最後一個軸。
  • kind: 要使用的選擇演算法。預設為 'introselect',它是快速選擇和中位數的中位數的混合體。
  • order: 用於複雜資料型別,用於指定要排序的欄位。

示例

在此示例中,陣列被分割槽,使得索引 2 處的元素被定位,所有在其之前的元素都小於或等於它,所有在其之後的元素都大於或等於它:

import numpy as np

arr = np.array([3, 1, 2, 5, 4])
partitioned_arr = np.partition(arr, 2)

print("Partitioned Array:", partitioned_arr)

獲得的輸出如下所示:

Partitioned Array: [1 2 3 5 4]

使用 argsort() 函式進行間接排序

NumPy 中的 np.argsort() 函式用於獲取將對陣列進行排序的索引。np.argsort() 函式不會返回排序後的陣列本身,而是返回一個索引陣列,表示應按什麼順序排列元素才能獲得排序後的陣列。

當您需要根據另一個數組的排序順序對一個數組進行排序時,此函式非常有用。以下是語法:

numpy.argsort(a, axis=-1, kind=None, order=None)

其中,

  • a: 您要排序的陣列。
  • axis: 要排序的軸。預設情況下,它設定為 -1,表示最後一個軸。
  • kind: 要使用的排序演算法。選項包括 'quicksort'、'mergesort'、'heapsort' 和 'stable'。預設為 'quicksort'。
  • order: 用於複雜資料型別,用於指定要排序的欄位。

示例

在下面的示例中,我們使用 np.argsort() 函式獲取將對陣列 "arr" 進行排序的索引。然後,我們使用這些索引將原始陣列重新排列為其排序順序:

import numpy as np

arr = np.array([3, 1, 2, 5, 4])
sorted_indices = np.argsort(arr)

print("Indices that would sort the array:", sorted_indices)
print("Sorted Array Using Indices:", arr[sorted_indices])

執行以上程式碼後,我們得到以下輸出:

Indices that would sort the array: [1 2 0 4 3]
Sorted Array Using Indices: [1 2 3 4 5]

排序結構化陣列

NumPy 中的結構化陣列允許您建立陣列,其中每個元素可以有多個欄位,每個欄位都有自己的資料型別。這類似於資料庫表或傳統程式語言中的記錄,其中每個條目可以儲存多種型別的資料。

您可以根據一個或多個欄位對結構化陣列進行排序。當您想根據特定條件對記錄進行排序時,這很有用。為此,您可以使用 NumPy 中的 np.sort() 函式,該函式接受一個 order 引數來指定要排序的欄位。

示例

在下面的示例中,我們根據 'age' 欄位對結構化陣列 "arr" 進行排序:

import numpy as np

arr = np.array([('John', 25), ('Alice', 30), ('Bob', 22)],
               dtype=[('name', 'U10'), ('age', 'i4')])
sorted_arr = np.sort(arr, order='age')

print("Sorted Structured Array:\n", sorted_arr)

產生的結果如下:

Sorted Structured Array:
[('Bob', 22) ('John', 25) ('Alice', 30)]

使用 lexsort() 函式進行字典序排序

np.lexsort() 函式使用一系列鍵執行間接排序。它獲取一系列欄位或列,並返回一個索引陣列,該陣列將根據這些鍵對輸入陣列進行排序。

numpy.lexsort(keys, axis=-1)

其中,

  • keys: 陣列序列或單個數組,其中每個陣列表示一個用於排序的鍵。鍵按提供的順序排序,這意味著序列中的最後一個鍵是主鍵,倒數第二個鍵是次鍵,依此類推。
  • axis: 要排序的軸。預設情況下,它設定為 -1,表示最後一個軸。

示例

在此示例中,np.lexsort() 函式用於首先根據名稱對陣列進行排序,如果名稱相同,則按年齡排序。排序順序基於字典序比較:

import numpy as np

names = np.array(['John', 'Alice', 'Bob'])
ages = np.array([25, 30, 22])
sorted_indices = np.lexsort((ages, names))

print("Indices for Lexicographical Sort:", sorted_indices)
print("Sorted Names and Ages:", names[sorted_indices], ages[sorted_indices])

我們得到如下所示的輸出:

Indices for Lexicographical Sort: [1 2 0]
Sorted Names and Ages: ['Alice' 'Bob' 'John'] [30 22 25]
廣告