点击蓝字关注我,有干货领取!html
Numpy提供了大量用数组操做的函数,其中不乏常见的排序函数。web
这里讲下numpy.sort
、numpy.argsort
、numpy.lexsort
三种排序函数的用法。面试
一、如何对数组元素进行快速排序?
使用numpy.sort
函数能够对数组进行排序,并返回排序好的数组。算法
使用方法:数组
numpy.sort(a, axis=-1, kind=None, order=None)
微信
参数:app
-
a : 要排序的数组; -
axis :按什么轴进行排序,默认按最后一个轴进行排序; -
kind :排序方法,默认是快速排序; -
order : 当数组定义了字段属性时,能够按照某个属性进行排序;
import numpy as np
# 建立一个一维数组
x1 = np.array([1,8,2,4])
x1
'''
一维数组:
array([1, 8, 2, 4])
'''
# 排序
np.sort(x1)
'''
输出:
array([1, 2, 4, 8])
'''
import numpy as np
# 建立一个二维数组
x2 = np.array([[1,8,2,4],[4,5,1,3]])
x2
'''
二维数组:
array([[1, 8, 2, 4],
[4, 5, 1, 3]])
'''
# 默认按最后一个轴排序,这里按行排序
np.sort(x2)
'''
输出:
array([[1, 2, 4, 8],
[1, 3, 4, 5]])
'''
# 轴设为0,即按列排序
np.sort(x2,axis=0)
'''
输出:
array([[1, 5, 1, 3],
[4, 8, 2, 4]])
'''
下面试下按照字段属性进行排序,须要用到order
参数。编辑器
import numpy as np
# 这是一个名字、身高、年龄的数组
# 先给各字段配置属性类型
dtype = [('Name', 'S10'), ('Height', float), ('Age', int)]
# 各字段值
values = [('Li', 1.8, 41), ('Wang', 1.9, 38),('Duan', 1.7, 38)]
# 建立数组
a = np.array(values, dtype=dtype)
a
'''
数组:
array([(b'Li', 1.8, 41), (b'Wang', 1.9, 38), (b'Duan', 1.7, 38)],
dtype=[('Name', 'S10'), ('Height', '<f8'), ('Age', '<i4')])
'''
# 按照属性Height进行排序,此时参数为字符串
np.sort(a, order='Height')
'''
输出:
array([(b'Duan', 1.7, 38), (b'Li', 1.8, 41), (b'Wang', 1.9, 38)],
dtype=[('Name', 'S10'), ('Height', '<f8'), ('Age', '<i4')])
'''
# 先按照属性Age排序,若是Age相等,再按照Height排序,此时参数为列表
np.sort(a, order=['Age', 'Height'])
'''
输出:
array([(b'Duan', 1.7, 38), (b'Wang', 1.9, 38), (b'Li', 1.8, 41)],
dtype=[('Name', 'S10'), ('Height', '<f8'), ('Age', '<i4')])
'''
二、如何获取数组元素排序后的索引?
numpy.argsort
函数用于将数组排序后,返回数组元素从小到大依次排序的全部元素索引。函数
使用方法(和sort相似):大数据
numpy.argsort(a, axis=-1, kind=None, order=None)
参数:
-
a : 要排序的数组; -
axis :按什么轴进行排序,默认按最后一个轴进行排序; -
kind :排序方法,默认是快速排序; -
order : 当数组定义了字段属性时,能够按照某个属性进行排序;
import numpy as np
# 建立一维数组
x = np.array([3, 1, 2])
'''
数组:
array([3, 1, 2])
'''
# 获取排序后的索引
np.argsort(x)
'''
输出:
array([1, 2, 0], dtype=int64)
'''
import numpy as np
# 建立二维数组
x2 = np.array([[0, 3], [2, 2]])
'''
数组:
array([[0, 3],
[2, 2]])
'''
# 默认按照最后一个轴进行排序,即行排序
# 获取排序后的索引
np.argsort(x2)
'''
输出:
array([[0, 1],
[0, 1]], dtype=int64)
'''
按字段属性进行排序,并获取索引。
# 先给各字段配置属性类型
dtype = [('name', str), ('age', int)]
# 值
values = [('Anna', 28), ('Bob', 27),('Brown',21)]
# 建立数组
x = np.array(values, dtype=dtype)
x
'''
数组:
array([('', 28), ('', 27), ('', 21)],
dtype=[('name', '<U'), ('age', '<i4')])
'''
# 先按照属性name排序,若是name相等,再按照age排序
np.argsort(x,order=['name','age'])
'''
输出:
array([2, 1, 0], dtype=int64)
'''
三、如何按多条件进行排序?
这里举一个应用场景:
小升初考试,重点班录取学生按照总成绩录取。
在总成绩相同时,数学成绩高的优先录取,在总成绩和数学成绩都相同时,按照英语成绩录取……
这里,总成绩排在电子表格的最后一列,数学成绩在倒数第二列,英语成绩在倒数第三列。
numpy.lexsort
函数用于按照多个条件(键)进行排序,返回排序后索引。
使用方法:
numpy.lexsort(keys, axis=-1)
参数:
-
keys :序列或元组,要排序的不一样的列; -
axis :沿指定轴进行排序;
说明:
使用键序列执行间接稳定排序。
给定多个排序键(能够将其解释为电子表格中的列),lexsort返回一个整数索引数组,该数组描述按多个列排序的顺序。
序列中的最后一个键用于主排序顺序,倒数第二个键用于辅助排序顺序,依此类推。
keys参数必须是能够转换为相同形状的数组的对象序列。
若是为keys参数提供了2D数组,则将其行解释为排序键,并根据最后一行,倒数第二行等进行排序。
import numpy as np
# 英语成绩
eng = [90,85,95,80]
# 数学成绩
math = [80,95,90,85]
# 总成绩
total = [170,170,185,165]
# 排序,获取索引
np.lexsort((eng,math,total))
'''
先按总成绩total进行排序,
再按数学成绩math进行排序,
最后按英语成绩进行排序。
能够看到total里有两个170,
这时候就按下一级math排序,
最后获取排序后的索引
输出:
array([3, 0, 1, 2], dtype=int64)
'''
# 也能够直接传入数组
score = np.array([[90,85,95,80],[80,95,90,85],[170,170,185,165]])
np.lexsort(score)
'''
输出:
array([3, 0, 1, 2], dtype=int64)
'''
参考资料
Numpy文档: https://numpy.org/devdocs/index.html
[2]Numpy教程: https://www.runoob.com/numpy/numpy-tutorial.html
-END-
TIPS
加入【Python数据分析】知识星球,带你走完数据科学流程!
往期精选
Python大数据分析
data creats value
长按二维码关注
本文分享自微信公众号 - Python大数据分析(pydatas)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。