陣列排序
NumPy 提供了不少陣列排序的方式,可以針對多維陣列與大量數據進行高效率的排序,這篇教學將會介紹 NumPy 裡陣列排序的做法。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
陣列排序的方法
NumPy 有下列幾種陣列排序的方法:
方法 | 參數 | 說明 |
---|---|---|
numpy.sort() | arr | 將陣列內容從小到大排序,產生新的陣列。 |
numpy.argsort() | arr | 將陣列從小到大排序後,回傳內容為「索引值」的陣列。 |
numpy.lexsort() | arr1, arr2 | 將兩個長度相同的陣列互相對照排序,回傳內容為「索引值」的陣列。 |
numpy.argmax()、numpy.argmin() | arr | 回傳最大值或最小值的「索引值」。 |
numpy.sort()
numpy.sort() 會將陣列內容從小到大排序,產生新的陣列。
a = np.array([5,3,4,2,1,6,7,9,8])
b = np.sort(a)
print(b) # [1 2 3 4 5 6 7 8 9]
numpy.sort() 除了必備的陣列參數外,還具有其他三個參數:
參數 | 說明 |
---|---|
axis | 排序的維度 ( 軸 ),預設 -1 ( 從最後的軸開始排序 ),可設定 None、0、1。 |
kind | 排序的演算法,預設 quicksort,另外還有 mergesort、heapsort 和 stable 三種。 |
order | 如果使用字串定義陣列的欄位,可以用來指定比較的欄位。 |
下方的程式會將 a 和 b 兩個分別是 3x2 和 2x2 的陣列,連接成一個新的 5x2 陣列。
import numpy as np
arr = [
[2,3],
[5,2],
[3,1]
]
a = np.array(arr)
b = np.sort(a) # 針對最後一軸排序 ( -1,二維陣列就是 1 ),所以只會排列 2 和 3、5 和 2、3 和 1
print(b)
'''
[[2 3]
[2 5]
[1 3]]
'''
c = np.sort(a, axis=None) # axis 設定 None 會打散並排序為一維陣列
print(c) # [1 2 2 3 3 5]
d = np.sort(a,axis=0) # 針對垂直維度 ( 0 軸 ) 由小到大排序,所有項目都是從小到大
print(d)
'''
[[2 1]
[3 2]
[5 3]]
'''
e = np.sort(a,axis=1) # 因為是二維陣列,axis 設定 1 等同 np.sort(a)
print(e)
'''
[[2 3]
[2 5]
[1 3]]
'''
如果針對結構化的資料,可以使用 order 的方式,針對指定字串的欄位進行排序。
import numpy as np
arr = [
('oxxo',200),
('gkpen',100),
('frank',300)
]
dt = np.dtype([('name','S10'),('num',int)])
a = np.array(arr, dtype = dt)
b = np.sort(a,order='name') # 針對 name 欄位排序
c = np.sort(a,order='num') # 針對 um 欄位排序
print(b) # [(b'frank', 300) (b'gkpen', 100) (b'oxxo', 200)]
print(c) # [(b'gkpen', 100) (b'oxxo', 200) (b'frank', 300)]
numpy.argsort()
numpy.argsort() 會將陣列從小到大排序後,回傳內容為「索引值」的陣列。
import numpy as np
arr = [
[2,3,7],
[5,2,6],
[3,1,2]
]
a = np.array(arr)
b = np.argsort(a)
print(b)
'''
[[0 1 2] # 對應 2,3,7
[1 0 2] # 對應 2,5,6
[1 2 0]] # 對應 1,2,3
'''
numpy.lexsort()
numpy.lexsort() 會將兩個長度相同的陣列互相對照排序,回傳內容為「索引值」的陣列,舉例來說,有 a 和 b 兩個陣列,當 a 從大到小排序後,b 會按照 a 的排列順序,將自身的元素進行排序。
import numpy as np
a = np.array([1,2,3,4,5,6,7,8])
b = np.array(['e','d','a','c','g','h','f','b'])
c = np.lexsort((a,b)) # b 先排序,然後 a 按照 b 的順序排序後回傳索引值
d = np.lexsort((b,a)) # a 先排序,然後 b 按照 a 的順序排序後回傳索引值
print(c) # [2 7 3 1 0 6 4 5] 對應 3 8 4 2 1 7 5 6
print(d) # [0 1 2 3 4 5 6 7]
numpy.argmax()、numpy.argmin()
numpy.argmax()、numpy.argmin() 會回傳最大值或最小值的「索引值」。
import numpy as np
a = np.array([1,2,3,4,5,6,7,8])
b = np.argmax(a)
c = np.argmin(a)
print(b) # 7 對應 8
print(c) # 0 對應 1
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~