NumPy - 沿軸排序



NumPy 中的沿軸排序

在 NumPy 中,陣列可以是多維的,排序可以沿著這些維度(軸)中的任何一個進行。沿軸排序意味著根據該軸上的值按特定順序排列陣列的元素。

在 NumPy 中,不同的軸是:**第 0 軸**(行),**第 1 軸**(列),以及**更高階軸**(深度或附加維度)。

np.sort() 函式

np.sort() 函式對陣列的元素進行排序,並返回一個包含排序後元素的新陣列。排序可以在指定的軸上進行,如果沒有指定軸,則函式預設沿最後一個軸排序。以下是語法:

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

其中,

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

沿軸 0(行)排序

在 NumPy 中沿軸 0 排序是指沿垂直軸排序陣列元素,這對應於二維陣列中的行。

當您想要根據每一列中的值來排序矩陣的行時,此操作很有用。

在二維陣列中:

  • 軸 0 對應於行。
  • 軸 1 對應於列。

沿軸 0 排序時,NumPy 會按列排序元素。對於每一列,值都按升序排列,行也相應地重新排序。

示例

在下面的示例中,我們使用 sort() 函式對每一列中的元素進行排序:

import numpy as np

# Create a 2D array
arr = np.array([[3, 6, 4], [5, 1, 2]])

# Sort along axis 0 (rows)
sorted_arr_axis0 = np.sort(arr, axis=0)

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

輸出將重新排序行,以便每一列中的值按升序排序:

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

沿軸 1(列)排序

在 NumPy 中沿軸 1 排序是指沿水平軸排序陣列元素,這對應於二維陣列中的列。當您想要根據它們的值來排序每一行中的元素時,此操作很有用。

沿軸 1 排序時,NumPy 會按行排序元素。對於每一行,值都按升序排列,列的順序也相應地調整。

示例

在這個例子中,我們使用 sort() 函式對每一行中的元素進行排序:

import numpy as np

# Create a 2D array
arr = np.array([[3, 2, 1], [6, 5, 4]])

# Sort along axis 1 (columns)
sorted_arr_axis1 = np.sort(arr, axis=1)

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

輸出將重新排序每一行中的列,以便值按升序排序:

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

多維陣列排序

NumPy 中的多維陣列排序涉及沿一個或多個特定軸組織陣列的元素。

在多維陣列中沿特定軸排序類似於二維陣列中的排序,但擴充套件到更高維度。以下是沿不同軸排序的工作方式:

  • **軸 0(第一維):**沿軸 0 排序會影響行。
  • **軸 1(第二維):**沿軸 1 排序會影響列。
  • **軸 2(第三維):**在三維陣列中,沿軸 2 排序會影響深度切片。

示例

在下面的示例中,我們沿不同的軸對三維陣列進行排序:深度(軸 0)、行(軸 1)和列(軸 2)。每次排序操作都會在指定的維度內排列元素,從而產生不同順序的陣列:

import numpy as np

# Create a 3D array
arr = np.array([[[3, 2, 1], [6, 5, 4]], [[9, 8, 7], [12, 11, 10]]])

# Sort along axis 0 (depth)
sorted_arr_axis0 = np.sort(arr, axis=0)

# Sort along axis 1 (rows)
sorted_arr_axis1 = np.sort(arr, axis=1)

# Sort along axis 2 (columns)
sorted_arr_axis2 = np.sort(arr, axis=2)

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

以下是上述程式碼的輸出:

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

 [[ 9  8  7]
  [12 11 10]]]
Sorted Along Axis 0:
 [[[ 3  2  1]
  [ 6  5  4]]

 [[ 9  8  7]
  [12 11 10]]]
Sorted Along Axis 1:
 [[[ 3  2  1]
  [ 6  5  4]]

 [[ 9  8  7]
  [12 11 10]]]
Sorted Along Axis 2:
[[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]]

使用不同的演算法進行排序

NumPy sort() 函式支援幾種排序演算法,每種演算法都有其自身的優勢:

  • 快速排序 (Quicksort)
  • 歸併排序 (Mergesort)
  • 堆排序 (Heapsort)
  • 穩定排序 (Stable Sort)

可以透過在 np.sort() 函式中設定 **kind** 引數來選擇這些演算法。預設情況下,NumPy 使用“快速排序”演算法。

排序演算法是按特定順序排列元素的方法。不同的演算法具有不同的效能特徵,並且針對各種型別的資料和陣列大小進行了最佳化。

示例

在這個例子中,陣列使用“快速排序”和“歸併排序”演算法沿軸“1”進行排序。不同的排序演算法會影響效能和穩定性:

import numpy as np

# Create a 2D array
arr = np.array([[3, 2, 1], [6, 5, 4]])

# Sort using different algorithms
sorted_quicksort = np.sort(arr, axis=1, kind='quicksort')
sorted_mergesort = np.sort(arr, axis=1, kind='mergesort')

print("Sorted with Quicksort:\n", sorted_quicksort)
print("Sorted with Mergesort:\n", sorted_mergesort)

獲得的輸出如下所示:

Sorted with Quicksort:
[[1 2 3]
 [4 5 6]]
Sorted with Mergesort:
[[1 2 3]
 [4 5 6]]
廣告