Numpy进阶之排序小技巧

简介: Numpy进阶之排序小技巧

Numpy提供了大量用数组操作的函数,其中不乏常见的排序函数。

这里讲下numpy.sortnumpy.argsortnumpy.lexsort三种排序函数的用法。

1、如何对数组元素进行快速排序?

使用numpy.sort函数可以对数组进行排序,并返回排序好的数组。

使用方法:

numpy.sort(a, axis=-1, kind=None, order=None)

参数:

  • 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')])
'''

2、如何获取数组元素排序后的索引?

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)
'''

3、如何按多条件进行排序?

这里举一个应用场景:

小升初考试,重点班录取学生按照总成绩录取。

在总成绩相同时,数学成绩高的优先录取,在总成绩和数学成绩都相同时,按照英语成绩录取……

这里,总成绩排在电子表格的最后一列,数学成绩在倒数第二列,英语成绩在倒数第三列。

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)
'''
相关文章
|
7月前
|
BI 索引 Python
利用Numpy读取iris数据集并进行排序、去重、求统计量等操作实战(附源码)
利用Numpy读取iris数据集并进行排序、去重、求统计量等操作实战(附源码)
398 0
|
3月前
|
机器学习/深度学习 搜索推荐 算法
NumPy 教程 之 NumPy 排序、条件筛选函数 8
NumPy提供了多种排序方法,包括快速排序、归并排序及堆排序,各有不同的速度、最坏情况性能、工作空间和稳定性特点。此外,NumPy还提供了`numpy.extract()`函数,可以根据特定条件从数组中抽取元素。例如,在一个3x3数组中,通过定义条件选择偶数元素,并使用该函数提取这些元素。示例输出为:[0., 2., 4., 6., 8.]。
31 8
|
3月前
|
机器学习/深度学习 搜索推荐 算法
NumPy 教程 之 NumPy 排序、条件筛选函数 5
NumPy中的排序方法及特性对比,包括快速排序、归并排序与堆排序的速度、最坏情况性能、工作空间及稳定性分析。并通过`numpy.argmax()`与`numpy.argmin()`函数演示了如何获取数组中最大值和最小值的索引,涵盖不同轴方向的操作,并提供了具体实例与输出结果,便于理解与实践。
28 5
|
3月前
|
机器学习/深度学习 搜索推荐 算法
NumPy 教程 之 NumPy 排序、条件筛选函数 2
介绍NumPy` 中的排序方法与条件筛选函数。通过对比快速排序、归并排序及堆排序的速度、最坏情况性能、工作空间需求和稳定性,帮助读者选择合适的排序算法。此外,还深入讲解了 `numpy.argsort()` 的使用方法,并通过具体实例展示了如何利用该函数获取数组值从小到大的索引值,并据此重构原数组,使得其变为有序状态。对于学习 `NumPy` 排序功能来说,本教程提供了清晰且实用的指导。
40 7
|
3月前
|
机器学习/深度学习 搜索推荐 算法
NumPy 教程 之 NumPy 排序、条件筛选函数 4
NumPy提供了多种排序方法,包括快速排序、归并排序及堆排序等,具有不同的执行速度、最坏情况性能、工作空间需求及稳定性特征。教程涵盖了`msort`、`sort_complex`、`partition`和`argpartition`等函数的使用方法,并通过实例展示了复数排序与分区排序的应用。例如,`np.sort_complex()`用于复数排序,`np.partition()`实现基于指定位置的分区排序,而`argpartition()`则帮助快速找到数组中的特定值。
15 0
|
7月前
|
搜索推荐 算法 索引
NumPy三种排序的表现与思考
NumPy排序法自我认为,并不是哪个排序算法速度快,或者稳定性高,就在项目中频繁的进行使用,这个跟我们开发的项目大小和环境也有一定的关系吧,选择合理的排序算法,也是能提高项目性能的。
|
7月前
|
搜索推荐 数据挖掘 数据处理
NumPy数组统计与排序方法全览
【4月更文挑战第17天】本文介绍了NumPy在Python中的数组统计和排序功能。主要包括计算平均值、标准差和方差的`np.mean()`, `np.std()`, `np.var()`方法,以及求最大值、最小值、百分位数的功能。在排序方面,讲解了基本排序的`np.sort()`,获取排序索引的`np.argsort()`,逆序排序和随机排序的方法。这些工具对于数据分析和科学计算十分实用,能有效提升数据处理效率。
|
IDE 搜索推荐 开发工具
Python 教程之 Numpy(11)—— 排序、搜索和计数
Python 教程之 Numpy(11)—— 排序、搜索和计数
59 0
|
SQL 索引 Python
【NumPy 数组连接、拆分、搜索、排序】
【NumPy 数组连接、拆分、搜索、排序】
|
存储 数据可视化 数据挖掘
【Numpy】数组的创建和常用函数(排序、连接、属性、reshape、索引和切片)
【Numpy】数组的创建和常用函数(排序、连接、属性、reshape、索引和切片)
204 0
【Numpy】数组的创建和常用函数(排序、连接、属性、reshape、索引和切片)