首页 > 编程笔记 > PHP笔记 阅读:1

NumPy数组排序的多个函数(附带实例)

NumPy 中可以借助 sort()、argsort() 和 lexsort() 对数组进行排序。

NumPy sort()函数

使用 sort() 函数进行排序将直接改变原数组,参数 axis 指定按行排序还是按列排序。

【实例】对数组元素按行和按列排序。对数组元素排序,程序代码如下:
import numpy as np 
n = np.array([[4, 7, 3], [2, 8, 5], [9, 1, 6]]) 
print("数组排序:") 
print(np.sort(n)) 
print("按行排序:") 
print(np.sort(n, axis=0)) 
print("按列排序:") 
print(np.sort(n, axis=1)) 
运行结果为: 

数组排序: 
[[3 4 7] 
 [2 5 8] 
 [1 6 9]] 
按行排序: 
[[2 1 3] 
 [4 7 5] 
 [9 8 6]] 
按列排序: 
[[3 4 7] 
 [2 5 8] 
 [1 6 9]] 

NumPy argsort()函数 

使用 argsort() 函数对数组元素排序,返回升序排列之后数组元素从小到大的索引值。 

【实例】对数组元素升序排序。  
import numpy as np 
x = np.array([4, 7, 3, 2, 8, 5, 1, 9, 6]) 
print("升序排列后的索引值") 
y = np.argsort(x) 
print(y) 
print("按排序后的顺序重构原数组") 
print(x[y]) 
运行结果: 

升序排列后的索引值: 
[6 3 2 0 5 8 1 4 7] 
按排序后的顺序重构原数组: 
[1 2 3 4 5 6 7 8 9] 

NumPy lexsort()函数

lexsort() 函数用于对多个序列进行排序,类似于对电子表格排序,每一列代表一个序列,排序时优先照顾靠后的列。 

【实例】通过排序解决成绩相同学生的录取问题。某重点高中精英班录取学生参考总成绩,由于名额有限,总成绩相同时,数学成绩高的优先录取;总成绩和数学成绩都相同时,英语成绩高的优先录取。下面使用 lexsort() 函数对学生成绩排序。  
import numpy as np 
math  = np.array([101, 109, 115, 108, 118, 118])   # 创建数学成绩数组 
en    = np.array([117, 105, 118, 108,  98, 109])   # 创建英语成绩数组 
total = np.array([621, 623, 620, 620, 615, 615])   # 创建总成绩数组 
sort_total = np.lexsort((en, math, total))          # 按 en → math → total 升序排序,返回索引 
print("排序后的索引值") 
print(sort_total) 
print("通过排序后的索引值获取排序后的数组:") 
print(np.array([[en[i], math[i], total[i]] for i in sort_total])) 
运行结果: 

排序后的索引值 
[4 5 3 2 0 1] 
通过排序后的索引值获取排序后的数组: 
[[ 98 118 615] 
 [109 118 615] 
 [108 108 620] 
 [118 115 620] 
 [117 101 621] 
 [105 109 623]]

在上述示例中,按照数学成绩、英语成绩和总成绩进行升序排列,总成绩为 620 分的有两名同学,按照数学成绩高的优先录取原则进行第一轮排序,总成绩为 615 分的两名同学的数学成绩也相同,则按照英语成绩高的优先录取原则进行第二轮排序。

相关文章