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 (' ') print ('排序:' ) print (np.sort(a)) print (' ') print ('轴 0 排序:') print (np.sort(a, axis = 0)) print (' ') # 排序函数中的顺序参数 dt = np.dtype([('name', 'S10'),('age', int)]) a = np.array([("kevin", 21),("peter",25),("tony", 17), ("mike",27)], dtype = dt) print ('数组:') print (a) print (' ') 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 (' ') print ('将argsort()应用于x:') y = np.argsort(x) print (y) print (' ') print ('按排序顺序重建原始数组:' ) print (x[y]) print (' ') 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 (' ') print ('应用argmax()函数:') print (np.argmax(a, 0)) print (' ') print ('应用argmin()函数:') print (np.argmin(a, 0) ) print (' ')
输出
数组: [[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("打印原始数组 ", b) print (' ') 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]