解读Numpy中的排序(sort,argsort)

 更新时间:2023年06月14日 10:24:17   作者:EvanForEver  
这篇文章主要介绍了关于Numpy中的排序(sort,argsort),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Numpy中的排序(sort,argsort)

按索引排序

>>import numpy as np
>>x=np.array([[0,12,48],[4,14,18],[1,7,99]])
#灵活应用索引和切片实现按索引的排序
#倒序的实现(普通列表也可用reverse实现,numpy则没有这个方法)
>>x[::-1]
array([[ 1,  7, 99],
       [ 4, 14, 18],
       [ 0, 12, 48]])
#指定顺序的实现(传入用于指定顺序的整数列表或ndarray即可)
>>x[[2,0,1]]
array([[ 1,  7, 99],
       [ 0, 12, 48],
       [ 4, 14, 18]])
>>x[[2,0,1],[0,2,1]] #只是截取部分元素,并不符合排序要求
array([ 1, 48, 14])
>>x[[2,0,1]][:,[0,2,1]]
array([[ 1, 99,  7],
       [ 0, 48, 12],
       [ 4, 18, 14]])
>>x[np.ix_([2,0,1],[0,2,1])] #np.ix_函数将两个一维数组转化为用于选取方形区域的索引器
array([[ 1, 99,  7],
       [ 0, 48, 12],
       [ 4, 18, 14]])
 

按值大小排序

ndarray.sort(axis=-1, kind='quicksort', order=None)

或者:

ndarray.sort(axis=-1, kind='quicksort', order=None)
参数描述
axis排序沿数组的(轴)方向,0表示按行,1表示按列,None表示展开来排序,默认值为-1,表示沿最后的轴排序
kind排序的算法,提供了快排'quicksort'、混排'mergesort'、堆排'heapsort', 默认为‘quicksort'
order排序的字段名,可指定字段排序,默认为None
>>import numpy as np
>>x=np.array([[0,12,48],[4,18,14],[7,1,99]])
>>np.sort(x)
array([[ 0, 12, 48],
       [ 4, 14, 18],
       [ 1,  7, 99]])
>>np.sort(x,axis=1)
array([[ 0, 12, 48],
       [ 4, 14, 18],
       [ 1,  7, 99]])
>>x.sort()
array([[ 0, 12, 48],
       [ 4, 14, 18],
       [ 1,  7, 99]])
>>dt = np.dtype([('name',  'S10'),('age',  int)]) 
>>a = np.array([("Mike",21),("Nancy",25),("Bob",  17),  ("Jane",27)], dtype = dt)
>>np.sort(a, order =  'name')
array([(b'Bob', 17), (b'Jane', 27), (b'Mike', 21), (b'Nancy', 25)],
      dtype=[('name', 'S10'), ('age', '<i4')])
>>np.sort(a, order =  'age')
array([(b'Bob', 17), (b'Mike', 21), (b'Nancy', 25), (b'Jane', 27)],
      dtype=[('name', 'S10'), ('age', '<i4')])
numpy.argsort(a, axis=-1, kind='quicksort', order=None)

对数组沿给定轴执行间接排序,并使用指定排序类型返回数据的索引数组。 这个索引数组用于构造排序后的数组。

参数类似于sort(),不作说明

>>import numpy as np
>>> x = np.array([3, 1, 2])
>>> a=np.argsort(x)
>>a #升序
#argsort函数返回的是数组值从小到大的索引值,[3, 1, 2]从小到大为[1,2,3],期对应的索引为[1,2,0] 
array([1, 2, 0]) 
>>np.argsort(-x) #降序
array([0, 2, 1], dtype=int64)
>>x[a] #以排序后的顺序重构原数组
array([1, 2, 3])
#二维数组
>>x=np.array([[0,12,48],[4,18,14],[7,1,99]])
>>a1=np.argsort(x)
>>a1
array([[0, 1, 2],
       [0, 2, 1],
       [1, 0, 2]], dtype=int64)
#以排序后的顺序重构原数组,注意与一维数组的形式不一样
>>np.array([np.take(x[i],x[i].argsort())for i in range(3)])
array([[ 0, 12, 48],
       [ 4, 14, 18],
       [ 1,  7, 99]])
>>x[x[:,2].argsort()] #按照第三列对行进行排序
array([[ 4, 18, 14],
       [ 0, 12, 48],
       [ 7,  1, 99]])
>>x.T[x.T[:,2].argsort()].T #按照第三行对列进行排序
array([[12,  0, 48],
       [18,  4, 14],
       [ 1,  7, 99]])
>>x[:,x[2].argsort()]  #还可以这样写
array([[12,  0, 48],
       [18,  4, 14],
       [ 1,  7, 99]])
 
lexsort(keys, axis=-1)

lexsort()根据键值的字典序进行排序,支持对数组按指定行或列的顺序排序,间接排序,不修改原数组,返回索引。一般对一维数组使用argsort()。

默认按最后一行元素有小到大排序, 返回最后一行元素排序后索引所在位置。

参数描述
'axis'数组排序时的基准,axis=0,按行排列;axis=1,按列排列
'keys'排序的参照物包括数组或包含N维的的元组,默认值为最后一行,(如果为二维数组则指最后一列)
>>import numpy as np 
>>x=np.array([[0,12,48],[4,18,14],[7,1,99]])
>>np.lexsort(x)
array([1, 0, 2], dtype=int64) #返回索引值
>>a=np.array([1,5,1,4,3,4,4])
>>b=np.array([9,4,0,4,0,2,1])
>>> ind=np.lexsort((b,a)) 
>>ind #将长度相同的a,b组合,再根据a值的大小进行排序,再考虑b值
array([2, 0, 4, 6, 5, 3, 1], dtype=int64) 
>>list(zip(a[ind],b[ind]))
[(1, 0), (1, 9), (3, 0), (4, 1), (4, 2), (4, 4), (5, 4)]
>>> c=[[1,5,1,4,3,4,4],[9,4,0,4,0,2,1]]
>>> np.lexsort(c) # 此种情况与先b后a的情况一致
array([2, 4, 6, 5, 3, 1, 0], dtype=int64)
#其他方法
#按最后一列顺序排序
>>x[np.lexsort(x.T)]
array([[ 4, 18, 14],
       [ 0, 12, 48],
       [ 7,  1, 99]])
#按最后一列逆序排序
>>x[np.lexsort(-x.T)] 
array([[ 7,  1, 99],
       [ 0, 12, 48],
       [ 4, 18, 14]])
#按第一列顺序排序
>>x[np.lexsort(x[:,::-1].T)]
array([[ 0, 12, 48],
       [ 4, 18, 14],
       [ 7,  1, 99]])
#按最后一行顺序排序
>>x.T[np.lexsort(x)].T 
array([[12,  0, 48],
       [18,  4, 14],
       [ 1,  7, 99]])
#按第一行顺序排序
>>x.T[np.lexsort(x[::-1,:])].T 
array([[ 0, 12, 48],
       [ 4, 18, 14],
       [ 7,  1, 99]])

numpy 数组排序np.sort()、np.argsort()

np.sort(a, axis=-1, kind=‘quicksort', order=None)

将指定轴上的每一个元素都按照从小到大的顺序排列。

Params:

  • axis:默认是-1,即最大维度,二维数组就是轴1,三维数组就是轴2。
  • kind:排序规则,有三个选项,如下,使用默认的就好
kindspeedworst casework spacestable
‘quicksort’1O(n^2)0no
‘mergesort’2O(n*log(n))~n/2yes
‘heapsort’3O(n*log(n))0no
  • order:指定排序的规则。

举例:

arr = np.array([[7,3,9],
                [9,0,8]])
np.sort(arr,axis=0)
array([[7, 0, 8],
       [9, 3, 9]])

指定axis=0,把每一列按照从小到大排列。

np.sort(arr,axis=1)
array([[3, 7, 9],
       [0, 8, 9]])

指定axis=1,把每一行按照从小到大排列。

np.argsort(a, axis=-1, kind=‘quicksort', order=None)

返回的是数组值从小到大排序的索引值。就是把数组升序排序,然后看看各个元素在原来数组中的索引值,看看排在第一小的数在原来数组的哪个位置。形状与传入数组相同。

参数使用同上。

举例:

这里我们举一个简单的例子,万变不离其宗。

ind = np.argsort([4,3,5,6,0],axis=0)
ind
array([4, 1, 0, 2, 3], dtype=int64)

附图解释。每个数字排序时,它的index也随着数值走。最后返回其原来的index。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python更换国内镜像源三种实用方法

    python更换国内镜像源三种实用方法

    这篇文章主要给大家介绍了关于python更换国内镜像源三种实用方法的相关资料,更换Python镜像源可以帮助解决使用pip安装包时速度过慢或无法连接的问题,需要的朋友可以参考下
    2023-09-09
  • Python如何用NumPy读取和保存点云数据

    Python如何用NumPy读取和保存点云数据

    这篇文章主要介绍了Python如何用NumPy读取和保存点云数据,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • 基于Python打造一个WiFi命令行安全审计工具

    基于Python打造一个WiFi命令行安全审计工具

    在当今数字化时代,无线WiFi网络已成为日常生活中不可或缺的基础设施,本文将基于Python pywifi库开发专业级无线安全评估工具,感兴趣的小伙伴可以跟随小编一起学习一下
    2026-03-03
  • 使用Python开发Telegram Bot的流程步骤

    使用Python开发Telegram Bot的流程步骤

    Telegram Bot 是一种可以与用户交互的机器人应用程序,通过 Telegram 的 Bot API 与服务器通信,它可以用来处理消息、执行命令、提供服务,如通知提醒、数据查询和自动化任务等,本文给大家介绍了如何用 Python 开发一个 Telegram Bot,需要的朋友可以参考下
    2025-01-01
  • 选择Python写网络爬虫的优势和理由

    选择Python写网络爬虫的优势和理由

    在本篇文章里小编给各位整理了一篇关于选择Python写网络爬虫的优势和理由以及相关代码实例,有兴趣的朋友们阅读下吧。
    2019-07-07
  • selenium + python 获取table数据的示例讲解

    selenium + python 获取table数据的示例讲解

    今天小编就为大家分享一篇selenium + python 获取table数据的示例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • python每5分钟从kafka中提取数据的例子

    python每5分钟从kafka中提取数据的例子

    今天小编就为大家分享一篇python每5分钟从kafka中提取数据的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python中将JSON数据写入文件的实现方法

    Python中将JSON数据写入文件的实现方法

    在Python开发中,JSON是一种轻量级的数据交换格式,常用于前后端数据交互、配置文件存储等场景,当我们需要将Python中的字典或列表等数据以JSON格式保存到文件时,就需要掌握如何将JSON数据写入文件的方法,所以本文给大家介绍了Python中将JSON数据写入文件的实现方法
    2025-06-06
  • python实现图片批量压缩程序

    python实现图片批量压缩程序

    这篇文章主要为大家详细介绍了python实现图片批量压缩程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • 基于Python开发一个小说图片PDF生成器

    基于Python开发一个小说图片PDF生成器

    本项目是一个基于 wxPython 开发的桌面应用程序,用于将图片和文字描述组合生成精美的 PDF 小说,它解决了创作者需要将图文内容快速整理成电子书的需求,特别适合绘本、图文小说、摄影作品集等场景,需要的朋友可以参考下
    2025-10-10

最新评论