
- NumPy 教程
- NumPy - 首頁
- NumPy - 簡介
- NumPy - 環境
- NumPy 陣列
- NumPy - Ndarray 物件
- NumPy - 資料型別
- NumPy 陣列的建立和操作
- NumPy - 陣列建立例程
- NumPy - 陣列操作
- NumPy - 從現有資料建立陣列
- NumPy - 從數值範圍建立陣列
- NumPy - 遍歷陣列
- NumPy - 陣列重塑
- NumPy - 陣列連線
- NumPy - 陣列堆疊
- NumPy - 陣列分割
- NumPy - 陣列扁平化
- NumPy - 陣列轉置
- NumPy 索引和切片
- NumPy - 索引和切片
- NumPy - 高階索引
- NumPy 陣列屬性和操作
- NumPy - 陣列屬性
- NumPy - 陣列形狀
- NumPy - 陣列大小
- NumPy - 陣列步長
- NumPy - 陣列元素大小
- NumPy - 廣播
- NumPy - 算術運算
- NumPy - 陣列加法
- NumPy - 陣列減法
- NumPy - 陣列乘法
- NumPy - 陣列除法
- NumPy 高階陣列操作
- NumPy - 交換陣列軸
- NumPy - 位元組交換
- NumPy - 複製和檢視
- NumPy - 元素級陣列比較
- NumPy - 陣列過濾
- NumPy - 陣列連線
- NumPy - 排序、搜尋和計數函式
- NumPy - 陣列搜尋
- NumPy - 陣列並集
- NumPy - 查詢唯一行
- NumPy - 建立日期時間陣列
- NumPy - 二元運算子
- NumPy - 字串函式
- NumPy - 數學函式
- NumPy - 統計函式
- NumPy - 矩陣庫
- NumPy - 線性代數
- NumPy - Matplotlib
- NumPy - 使用 Matplotlib 繪製直方圖
- NumPy - NumPy 的 I/O 操作
- NumPy 排序和高階操作
- NumPy - 陣列排序
- NumPy - 沿軸排序
- NumPy - 使用花式索引排序
- NumPy - 結構化陣列
- NumPy - 建立結構化陣列
- NumPy - 操作結構化陣列
- NumPy - 欄位訪問
- NumPy - 記錄陣列
- Numpy - 載入陣列
- Numpy - 儲存陣列
- NumPy - 向陣列追加值
- NumPy - 交換陣列列
- NumPy - 向陣列插入軸
- NumPy 處理缺失資料
- NumPy - 處理缺失資料
- NumPy - 識別缺失值
- NumPy - 刪除缺失資料
- NumPy - 填充缺失資料
- NumPy 效能最佳化
- NumPy - 使用陣列進行效能最佳化
- NumPy - 使用陣列進行向量化
- NumPy - 陣列的記憶體佈局
- Numpy 線性代數
- NumPy - 線性代數
- NumPy - 矩陣庫
- NumPy - 矩陣加法
- NumPy - 矩陣減法
- NumPy - 矩陣乘法
- NumPy - 元素級矩陣運算
- NumPy - 點積
- NumPy - 矩陣求逆
- NumPy - 行列式計算
- NumPy - 特徵值
- NumPy - 特徵向量
- NumPy - 奇異值分解
- NumPy - 求解線性方程組
- NumPy - 矩陣範數
- NumPy 元素級矩陣運算
- NumPy - 求和
- NumPy - 求平均值
- NumPy - 求中位數
- NumPy - 求最小值
- NumPy - 求最大值
- NumPy 集合運算
- NumPy - 唯一元素
- NumPy - 交集
- NumPy - 並集
- NumPy - 差集
- NumPy 有用資源
- NumPy 編譯器
- NumPy - 快速指南
- NumPy - 有用資源
- NumPy - 討論
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]