NumPy 排序、查找、計數



章節


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]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM