Numpy中的排序(sort,argsort)

2023-10-27

按索引排序

>>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]])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Numpy中的排序(sort,argsort) 的相关文章

随机推荐

  • 教师怎样将成绩单独发送给学生和家长?

    在工作学习中 我们经常会遇到怎样将成绩单独发送给学生和家长这样的问题 因此 面对怎样将成绩单独发送给学生和家长我们应该有努力探索的精神 诚挚的心灵 是学生情感的钥匙 高尚的师德 是学生心灵的明镜 对于这个问题也是一样的 读书忌死读 死读钻牛
  • redhat7.6安装weblogic12c

    目录 一 环境准备 二 使用root创建用户和组 三 创建部署目录 四 上传安装包 五 创建 oraInst loc 文件 六 创建wls rsp 响应文件 七 进行安装 八 使用 wlst sh 离线模式创建一个域 九 启动服务 十 浏览
  • 电脑wps可以语音录入吗_怎样用word进行语音录入文字

    怎样用 word 进行语音录入文字 有时候我们不方便手敲键盘输入时 可以利用 word 的语音录入功能进行输入 以下是学习啦小编为您带来的关于用 Word 进行语音录入文字 希望对您有所帮助 用 Word 进行语音录入文字 语音输入功能添加
  • 最适合程序猿的笔记软件

    因为这几天小编要去听课 所以心血来潮找了几个适合程序猿的笔记软件 经过几天在csdn上的扒饭之后 我结合自己的某些要求 为大家整理出了这几个软件 有需要直接去后面找 一 必须支持markdown markdown的重要性不需要在这里多说了吧
  • TypeScript 联合类型(union type)

    TS是JS的超集 在JS的基础上添加了一套类型系统 这样的TS可以被静态分析带来的好处显而易见 let val string val 声明一个string类型的变量val let val string val val 1 Type numb
  • hive异常MetaException-Metastore contains multiple versions

    在执行hive运行脚本时 出现了MetaException Metastore contains multiple versions异常错误 Exception in thread main java lang RuntimeExcepti
  • Java 手动分页

    功能需求背景 今天负责短信后台定时任务时 需要定时向用户发送短信信息 但数据库记录的待发送记录数量比较大 无法一次查询出结果 需要手动分页 手动分页核心功能代码 Date now DateUtils getBeforeMouth new D
  • Arduino基本知识

    analogWrite 将一个模拟数值写进Arduino引脚 这个操作可以用来控制LED的亮度 或者控制电机的转速 Arduino每一次对引脚执行analogWrite 指令 都会给该引脚一个固定频率的PWM信号 digitalRead 读
  • 基于FPGA的图像采集之二 GEN_FRAME(成帧)模块

    距离上次的博客已经有段时间了 这写些日子一直在调SDRAM的模块以及文档的书写 SDRAM的子模块比较多 包括init 初始化模块 refresh 刷新模块 write 写模块 read 读模块 使用起来相比之前的USB控制模块 今天的GE
  • JAVA中队列,数据结构队列入队操作

    java中构造函数和构造方法的区别 Java中什么是构造函数 构造函数和普通函数的区别如下 1 写法上的不同 施工方法 Public modifier class 定义类的关键字 Test 类名 没有参数 测试 类名 接受一个参数 测试 类
  • 使用Visual Studio写一个简单的Windows窗体应用登录界面

    需要的知识 C 的基本语法 以及Visual Studio的基本操作方法 编辑软件 Sql Server 2017 Visual Studio 2017 前提 Sql Server 中有一个名为 MY LAPTOP 的服务器 一个名为 Te
  • 初学(9)——Hadoop错误:ssh: Could not resolve hostname master: Name or service not known

    进行ssh访问时出现错误 ssh Could not resolve hostname master Name or service not known 解决方法 修改hosts文件 将名称和IP建立联系 1 打开 etc目录下hosts文
  • 深入理解Go——context(2)

    文章目录 结构体 emptyCtx cancleCtx timerCtx valueCtx 结构体 emptyCtx 源码中定义了 Context 接口后 并且给出了一个实现 type emptyCtx int func emptyCtx
  • Spring Boot 实现各种参数校验

    目录 1 简单使用 1 引入依赖 2 requestBody参数校验 3 requestParam PathVariable参数校验 4 统一异常处理 2 进阶使用 1 分组校验 2 嵌套校验 3 集合校验 4 自定义校验 5 编程式校验
  • 完整的微信小程序支付开发记录(亲测)

    这次呢是开发小程序的支付功能 因为没有做过 特此记录 做一个小总结 以便以后使用以及给小伙伴们提供一个像我一样的小白一个参考 我也是一点一点摸索过来的 此文只针对开发支付流程而言以及出现的问题 其它则会略过 只讲解实际动手开发过程 名词和实
  • findbugs错误总结

    本篇是从别人那找到的 为了让我回头查看findbugs错误怎么解决而保存的 有很多问题其实挺隐晦的 比如第三条 还有人会使用 来判断常量字符串和String类型是否相等 这个就是基础不牢的缘故了 记得把findbugs尽量清零哦 1 NP
  • 简单的postgersql存储过程样例

    建表 CREATE TABLE Employees Id serial Name VARCHAR 100 DateOfBirth Date City VARCHAR 100 Designation VARCHAR 100 JoiningDa
  • 小米r3g openwrt软件源,换源

    小米r3g openwrt软件源 换源 自带的源不好用 自己找了一个 还是在中科大源站上改的 中科大这个网站上的资源太多了 ssh登录后替换 etc opkg distfeeds conf 里面的源地址 也可能是 etc opkg conf
  • 【Android】[2] 如何制作启动倒计时页

    前言 实现效果 源码地址 https github com littlecurl AppProjects 进去找AndroidCountDown或者AndroidCountDown zip进行下载 前提条件 红黑联盟 Android性能优化
  • Numpy中的排序(sort,argsort)

    按索引排序 gt gt import numpy as np gt gt x np array 0 12 48 4 14 18 1 7 99 灵活应用索引和切片实现按索引的排序 倒序的实现 普通列表也可用reverse实现 numpy则没有