鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ NumPy排序、搜索和計(jì)數(shù)函數(shù)
NumPy位操作
NumPy數(shù)學(xué)算數(shù)函數(shù)
NumPy高級索引
NumPy環(huán)境安裝配置
NumPy IO文件操作
NumPy字符串函數(shù)
NumPy切片和索引
NumPy統(tǒng)計(jì)函數(shù)
NumPy矩陣庫
NumPy數(shù)組創(chuàng)建例程
NumPy線性代數(shù)
NumPy Matplotlib庫
NumPy教程
NumPy排序、搜索和計(jì)數(shù)函數(shù)
NumPy字節(jié)交換
NumPy Ndarray對象
NumPy數(shù)組操作
NumPy使用 Matplotlib 繪制直方圖
NumPy數(shù)組屬性
NumPy廣播
NumPy來自現(xiàn)有數(shù)據(jù)的數(shù)組
NumPy副本和視圖
NumPy在數(shù)組上的迭代
NumPy來自數(shù)值范圍的數(shù)組
NumPy算數(shù)運(yùn)算
NumPy數(shù)據(jù)類型

NumPy排序、搜索和計(jì)數(shù)函數(shù)

NumPy - 排序、搜索和計(jì)數(shù)函數(shù)

NumPy中提供了各種排序相關(guān)功能。 這些排序函數(shù)實(shí)現(xiàn)不同的排序算法,每個排序算法的特征在于執(zhí)行速度,最壞情況性能,所需的工作空間和算法的穩(wěn)定性。 下表顯示了三種排序算法的比較。

種類 速度 最壞情況 工作空間 穩(wěn)定性
'quicksort'(快速排序) 1 O(n^2) 0
'mergesort'(歸并排序) 2 O(n*log(n)) ~n/2
'heapsort'(堆排序) 3 O(n*log(n)) 0

numpy.sort()

sort()函數(shù)返回輸入數(shù)組的排序副本。 它有以下參數(shù):

numpy.sort(a, axis, kind, order)

其中:

序號 參數(shù)及描述
1. a 要排序的數(shù)組
2. axis 沿著它排序數(shù)組的軸,如果沒有數(shù)組會被展開,沿著最后的軸排序
3. kind 默認(rèn)為'quicksort'(快速排序)
4. order 如果數(shù)組包含字段,則是要排序的字段

示例

import numpy as np  
a = np.array([[3,7],[9,1]])  
print  '我們的數(shù)組是:'  
print a 
print  '\n'  
print  '調(diào)用 sort() 函數(shù):'  
print np.sort(a)  
print  '\n'  
print  '沿軸 0 排序:'  
print np.sort(a, axis =  0)  
print  '\n'  
# 在 sort 函數(shù)中排序字段 
dt = np.dtype([('name',  'S10'),('age',  int)]) 
a = np.array([("raju",21),("anil",25),("ravi",  17),  ("amar",27)], dtype = dt)  
print  '我們的數(shù)組是:'  
print a 
print  '\n'  
print  '按 name 排序:'  
print np.sort(a, order =  'name')

輸出如下:

我們的數(shù)組是:
[[3 7]
 [9 1]]

調(diào)用 sort() 函數(shù):
[[3 7]
 [1 9]]

沿軸 0 排序:
[[3 1]
 [9 7]]

我們的數(shù)組是:
[('raju', 21) ('anil', 25) ('ravi', 17) ('amar', 27)]

按 name 排序:
[('amar', 27) ('anil', 25) ('raju', 21) ('ravi', 17)]

numpy.argsort()

numpy.argsort()函數(shù)對輸入數(shù)組沿給定軸執(zhí)行間接排序,并使用指定排序類型返回?cái)?shù)據(jù)的索引數(shù)組。 這個索引數(shù)組用于構(gòu)造排序后的數(shù)組。

示例

import numpy as np 
x = np.array([3,  1,  2])  
print  '我們的數(shù)組是:'  
print x 
print  '\n'  
print  '對 x 調(diào)用 argsort() 函數(shù):' 
y = np.argsort(x)  
print y 
print  '\n'  
print  '以排序后的順序重構(gòu)原數(shù)組:'  
print x[y]  
print  '\n'  
print  '使用循環(huán)重構(gòu)原數(shù)組:'  
for i in y:  
    print x[i],

輸出如下:

我們的數(shù)組是:
[3 1 2]

對 x 調(diào)用 argsort() 函數(shù):
[1 2 0]

以排序后的順序重構(gòu)原數(shù)組:
[1 2 3]

使用循環(huán)重構(gòu)原數(shù)組:
1 2 3

numpy.lexsort()

函數(shù)使用鍵序列執(zhí)行間接排序。 鍵可以看作是電子表格中的一列。 該函數(shù)返回一個索引數(shù)組,使用它可以獲得排序數(shù)據(jù)。 注意,最后一個鍵恰好是 sort 的主鍵。

示例

import numpy as np 

nm =  ('raju','anil','ravi','amar') 
dv =  ('f.y.',  's.y.',  's.y.',  'f.y.') 
ind = np.lexsort((dv,nm))  
print  '調(diào)用 lexsort() 函數(shù):'  
print ind 
print  '\n'  
print  '使用這個索引來獲取排序后的數(shù)據(jù):'  
print  [nm[i]  +  ", "  + dv[i]  for i in ind]

輸出如下:

調(diào)用 lexsort() 函數(shù):
[3 1 0 2]

使用這個索引來獲取排序后的數(shù)據(jù):
['amar, f.y.', 'anil, s.y.', 'raju, f.y.', 'ravi, s.y.']

NumPy 模塊有一些用于在數(shù)組內(nèi)搜索的函數(shù)。 提供了用于找到最大值,最小值以及滿足給定條件的元素的函數(shù)。

numpy.argmax()numpy.argmin()

這兩個函數(shù)分別沿給定軸返回最大和最小元素的索引。

示例

import numpy as np 
a = np.array([[30,40,70],[80,20,10],[50,90,60]])  
print  '我們的數(shù)組是:'  
print a 
print  '\n'  
print  '調(diào)用 argmax() 函數(shù):'  
print np.argmax(a)  
print  '\n'  
print  '展開數(shù)組:'  
print a.flatten()  
print  '\n'  
print  '沿軸 0 的最大值索引:' 
maxindex = np.argmax(a, axis =  0)  
print maxindex 
print  '\n'  
print  '沿軸 1 的最大值索引:' 
maxindex = np.argmax(a, axis =  1)  
print maxindex 
print  '\n'  
print  '調(diào)用 argmin() 函數(shù):' 
minindex = np.argmin(a)  
print minindex 
print  '\n'  
print  '展開數(shù)組中的最小值:'  
print a.flatten()[minindex]  
print  '\n'  
print  '沿軸 0 的最小值索引:' 
minindex = np.argmin(a, axis =  0)  
print minindex 
print  '\n'  
print  '沿軸 1 的最小值索引:' 
minindex = np.argmin(a, axis =  1)  
print minindex

輸出如下:

我們的數(shù)組是:
[[30 40 70]
 [80 20 10]
 [50 90 60]]

調(diào)用 argmax() 函數(shù):
7

展開數(shù)組:
[30 40 70 80 20 10 50 90 60]

沿軸 0 的最大值索引:
[1 2 0]

沿軸 1 的最大值索引:
[2 0 1]

調(diào)用 argmin() 函數(shù):
5

展開數(shù)組中的最小值:
10

沿軸 0 的最小值索引:
[0 1 1]

沿軸 1 的最小值索引:
[0 2 0]

numpy.nonzero()

numpy.nonzero()函數(shù)返回輸入數(shù)組中非零元素的索引。

示例

import numpy as np 
a = np.array([[30,40,0],[0,20,10],[50,0,60]])  
print  '我們的數(shù)組是:'  
print a 
print  '\n'  
print  '調(diào)用 nonzero() 函數(shù):'  
print np.nonzero (a)

輸出如下:

我們的數(shù)組是:
[[30 40 0]
 [ 0 20 10]
 [50 0 60]]

調(diào)用 nonzero() 函數(shù):
(array([0, 0, 1, 1, 2, 2]), array([0, 1, 1, 2, 0, 2]))

numpy.where()

where()函數(shù)返回輸入數(shù)組中滿足給定條件的元素的索引。

示例

import numpy as np 
x = np.arange(9.).reshape(3,  3)  
print  '我們的數(shù)組是:'  
print x 
print  '大于 3 的元素的索引:' 
y = np.where(x >  3)  
print y 
print  '使用這些索引來獲取滿足條件的元素:'  
print x[y]

輸出如下:

我們的數(shù)組是:
[[ 0. 1. 2.]
 [ 3. 4. 5.]
 [ 6. 7. 8.]]

大于 3 的元素的索引:
(array([1, 1, 2, 2, 2]), array([1, 2, 0, 1, 2]))

使用這些索引來獲取滿足條件的元素:
[ 4. 5. 6. 7. 8.]

numpy.extract()

extract()函數(shù)返回滿足任何條件的元素。

import numpy as np 
x = np.arange(9.).reshape(3,  3)  
print  '我們的數(shù)組是:'  
print x 
# 定義條件 
condition = np.mod(x,2)  ==  0  
print  '按元素的條件值:'  
print condition 
print  '使用條件提取元素:'  
print np.extract(condition, x)

輸出如下:

我們的數(shù)組是:
[[ 0. 1. 2.]
 [ 3. 4. 5.]
 [ 6. 7. 8.]]

按元素的條件值:
[[ True False True]
 [False True False]
 [ True False True]]

使用條件提取元素:
[ 0. 2. 4. 6. 8.]