章節
NumPy中提供了各種排序相關的函數。這些排序函數實現了不同的排序算法,每個算法的特點是執行速度、最壞情況性能、所需的工作空間和算法的穩定性。下表為三種排序算法的比較。
種類 | 速度 | 最差情況 | 工作區 | 穩定性 |
---|---|---|---|---|
‘quicksort’ | 1 | O(n^2) | 0 | no |
‘mergesort’ | 2 | O(n*log(n)) | ~n/2 | yes |
‘heapsort’ | 3 | O(n*log(n)) | 0 | no |
numpy.sort()
sort()
對數組進行排序,返回排好序的數組副本。可以指定軸方向。
函數語法:
numpy.sort(a, axis, kind, order)
參數
- a 待排序數組
- axis 指定排序的軸。如果沒有,按最后一個軸排序。
- kind 默認是‘quicksort’
- order 指定排序字段
示例
import numpy as np
a = np.array([[3,7],[9,1]])
print ('數組:' )
print (a)
print ('\n')
print ('排序:' )
print (np.sort(a))
print ('\n')
print ('軸 0 排序:')
print (np.sort(a, axis = 0))
print ('\n')
# 排序函數中的順序參數
dt = np.dtype([('name', 'S10'),('age', int)])
a = np.array([("kevin", 21),("peter",25),("tony", 17), ("mike",27)], dtype = dt)
print ('數組:')
print (a)
print ('\n')
print ('按 name 排序:')
print (np.sort(a, order = 'name'))
輸出
數組:
[[3 7]
[9 1]]
排序:
[[3 7]
[1 9]]
軸 0 排序:
[[3 1]
[9 7]]
數組:
[(b'kevin', 21) (b'peter', 25) (b'tony', 17) (b'mike', 27)]
按 name 排序:
[(b'kevin', 21) (b'mike', 27) (b'peter', 25) (b'tony', 17)]
numpy.argsort()
該函數先對數組進行排序,然后提取排序后的數組索引,以數組形式返回,原數組不會被修改,通過索引可以得到排序結果。
示例
import numpy as np
x = np.array([3, 1, 2])
print ('數組x:')
print (x)
print ('\n')
print ('將argsort()應用於x:')
y = np.argsort(x)
print (y)
print ('\n')
print ('按排序順序重建原始數組:' )
print (x[y])
print ('\n')
print ('使用循環重構原始數組:')
for i in y:
print (x[i])
輸出
數組x:
[3 1 2]
將argsort()應用於x:
[1 2 0]
按排序順序重建原始數組:
[1 2 3]
使用循環重構原始數組:
1
2
3
numpy.lexsort()
用於對多個序列進行排序,類似於SQL中的ORDERBY多個字段:ORDER BY 字段1, 字段2, 字段3
。可以想象成對電子表格進行排序,每一列代表一個序列,越后面的列優先級越高。
原數組不會被修改,該函數提取排序后的數組索引,以數組形式返回,通過索引可以得到排序結果。
示例
import numpy as np
a = np.array(['a','b','c','d','e'])
b = np.array([12, 90, 380, 12, 211])
ind = np.lexsort((a,b))
print("打印排序后的數組索引:")
print(ind)
print("使用索引對數組排序:")
for i in ind:
print(a[i],b[i])
輸出
打印排序后的數組索引:
[0 3 1 4 2]
使用索引對數組排序:
a 12
d 12
b 90
e 211
c 380
numpy.argmax() 與 numpy.argmin()
這兩個函數分別返回指定軸上,最大和最小元素的索引。
示例
import numpy as np
a = np.array([[30,40,70],[80,20,10],[50,90,60]])
print ('數組:')
print (a)
print ('\n')
print ('應用argmax()函數:')
print (np.argmax(a, 0))
print ('\n')
print ('應用argmin()函數:')
print (np.argmin(a, 0) )
print ('\n')
輸出
數組:
[[30 40 70]
[80 20 10]
[50 90 60]]
應用argmax()函數:
[1 2 0]
應用argmin()函數:
[0 1 1]
numpy.nonzero()
該函數返回數組中非零元素的索引。
示例
import numpy as np
b = np.array([12, 90, 380, 12, 211])
print("打印原始數組\n", b)
print ('\n')
print("打印非零元素的位置")
print(b.nonzero())
輸出
打印原始數組
[ 12 90 380 12 211]
打印非零元素的位置
(array([0, 1, 2, 3, 4]),)
numpy.where()
該函數查找數組中符合條件的元素,返回其索引。
示例
import numpy as np
b = np.array([12, 90, 380, 12, 211])
print(np.where(b>12))
c = np.array([[20, 24],[21, 23]])
print(np.where(c>20))
輸出
(array([0, 1, 1]), array([1, 0, 1]))
numpy.extract()
該函數返回數組中符合條件的元素。
示例
import numpy as np
b = np.array([12, 90, 380, 12, 211])
print(np.extract(b>12, b))
c = np.array([[20, 24],[21, 23]])
print(np.extract(c>20, c))
輸出
[ 90 380 211]
[24 21 23]