numpy多级排序lexsort函数的使用

 更新时间:2023年03月27日 15:03:20   作者:地球被支点撬走啦  
本文主要介绍了numpy多级排序lexsort函数的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、lexsort() 排的是个啥

 lexsort() 函数的定义如下:

def lexsort(keys, axis=None)

lexsort是一种多级排序方法。作用为对给定的 keys 中的最后一个 key 排序,每一个 key 都被认为是列向量,其他 keys 用来辅助最后一个 key 进行排序。最后返回最后一个 key 进行排序的索引。

哈哈哈是不是没看懂上面的解释?莫慌莫慌,我给举个简单的例子保证秒懂,可以回想这样一个场景:

对一堆学生的成绩进行排名,则排名结果就是按照总成绩从低到高排序,这个还没排序的总成绩表就是上述说的最后一个 key ,排序后的索引就是上述的返回值。

比如初始总成绩数组为:[99, 100, 98, 95, 80]  ,这就是 最后一个 key,升序排序后的数组为:[80, 95, 98, 99, 100],对应的索引为:[4, 3, 2, 0, 1],这个索引数组就是 lexsort 函数的返回值。

但是如果两个人的总成绩一样怎么进一步排序呢?这时可以按照语文成绩的升序进行排序,如果语文成绩还一样呢?那再看数学成绩,如果数学还一样呢?再查英语成绩,如果还。。。(没了没了,再相同我就要怀疑这俩人作弊了!)这里的 语文成绩、数学成绩、英语成绩 就是最后一个 key 前面的 keys,记得是从后往前数的。也就是最后一个 key 相同,就看倒数第二个 key,倒数第二个相同就看倒数第三个 key。

2、举个例子

默认你已经理解了,那就举一个例子来过一遍:

import numpy as np
a = [[3, 3, 8],
     [6, 9, 7],
     [3, 3, 2]]
b = np.array(a)  # 转换为 numpy 数组
"""
index = np.lexsort((b[:, 2], b[:, 1], b[:, 0])) 的运行情况:
step-1、首先按照第一列 b[:, 0] 的数值 [3, 6, 3] 升序顺序对每行的位置进行重排, 第一行有两个值相同, 转到step-2
            [[3, 3, 8],        [[3, 3, 8],
             [6, 9, 7],   -->   [3, 3, 2],   
             [3, 3, 2]]         [6, 9, 7]]
step-2、第一列数值相同的情况下按照相应位置第二列 b[:, 1] 的值继续排序, 第二列对应位置任然相同, 转到step-3
            [[3, 3, 8],        [[3, 3, 8],
             [6, 9, 7],   -->   [3, 3, 2],   
             [3, 3, 2]]         [6, 9, 7]]
step-3、第二列数值相同的情况下按照相应位置第三列 b[:, 2] 的值继续排序
            [[3, 3, 8],        [[3, 3, 2],
             [6, 9, 7],   -->   [3, 3, 8],   
             [3, 3, 2]]         [6, 9, 7]]
总结: 第一列的排序结果为[3, 3, 6] 对应的索引值为 [2, 0, 1]
"""
index = np.lexsort((b[:, 2], b[:, 1], b[:, 0]))
print(index)  # 输出结果: [2 0 1]
ans = b[index] # 按照排序结果重置数组元素的位置
print(ans)
# ans 的结果:
[[3 3 2]
 [3 3 8]
 [6 9 7]]

如果直接对矩阵进行排序呢?

"""
相当于拆解为
key1 = b[0,:]
key2 = b[1,:]
key3 = b[2,:]  # 最后一行为主排序序列
index = np.lexsort(b) 等效为: index = np.lexsort((b[0,:], b[1,:], b[2,:]))
"""
index = np.lexsort(b) 
print(index)  # 输出结果: [2 0 1]

即,当输入是一个矩阵时,默认排序最后一行的数据,前面的行都是辅助行。

到此这篇关于numpy多级排序lexsort函数的使用的文章就介绍到这了,更多相关numpy lexsort函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一些关于python 装饰器的个人理解

    一些关于python 装饰器的个人理解

    这篇文章主要介绍了python 装饰器的一些理解,希望可以帮助大家更好的学习和使用python,感兴趣的朋友可以了解下
    2020-08-08
  • 解决Python requests 报错方法集锦

    解决Python requests 报错方法集锦

    这篇文章主要介绍了解决Python requests 报错方法集锦的相关资料,需要的朋友可以参考下
    2017-03-03
  • 使用python中的openpyxl操作excel详解

    使用python中的openpyxl操作excel详解

    这篇文章主要介绍了使用python中的openpyxl操作excel详解,openpyxl 模块是一个读写Excel文档的Python库,本文就来讲解如何使用openpyxl操作excel,需要的朋友可以参考下
    2023-07-07
  • 解决keras backend 越跑越慢问题

    解决keras backend 越跑越慢问题

    这篇文章主要介绍了解决keras backend 越跑越慢问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python多线程编程(三):threading.Thread类的重要函数和方法

    Python多线程编程(三):threading.Thread类的重要函数和方法

    这篇文章主要介绍了Python多线程编程(三):threading.Thread类的重要函数和方法,本文讲解了线程名称、join方法、setDaemon方法等内容,需要的朋友可以参考下
    2015-04-04
  • Django中数据在前后端传递的方式之表单、JSON与ajax

    Django中数据在前后端传递的方式之表单、JSON与ajax

    Django从后台往前台传递数据时有多种方法可以实现,下面这篇文章主要给大家介绍了关于Django中数据在前后端传递的方式之表单、JSON与ajax的相关资料,需要的朋友可以参考下
    2022-10-10
  • python3安装OCR识别库tesserocr过程图解

    python3安装OCR识别库tesserocr过程图解

    这篇文章主要介绍了python3安装OCR识别库tesserocr过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Python实现的递归神经网络简单示例

    Python实现的递归神经网络简单示例

    这篇文章主要介绍了Python实现的递归神经网络,是一篇摘录自github代码片段的文章,涉及Python递归与数学运算相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • Matplotlib实战之百分比柱状图绘制详解

    Matplotlib实战之百分比柱状图绘制详解

    百分比堆叠式柱状图是一种特殊的柱状图,可以用于可视化比较不同类别或组的百分比或比例的图表,下面我们就来介绍一下如何使用Matplotlib绘制百分比柱状图,需要的可以参考下
    2023-08-08
  • Python线程障碍对象Barrier原理详解

    Python线程障碍对象Barrier原理详解

    这篇文章主要介绍了Python线程障碍对象Barrier原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论