数组排序
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
微信扫码关注
抖音扫码关注