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递归查询菜单并转换成json实例

    python递归查询菜单并转换成json实例

    本篇文章主要介绍了python递归查询菜单并转换成json实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • 基于Python制作短信发送程序

    基于Python制作短信发送程序

    这篇文章主要为大家详细介绍了如何利用Python制作短信发送程序,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-01-01
  • python基础篇之pandas常用基本函数汇总

    python基础篇之pandas常用基本函数汇总

    Pandas是一个python数据分析库,它提供了许多函数和方法来加快数据分析过程,下面这篇文章主要给大家介绍了关于python基础篇之pandas常用基本函数的相关资料,需要的朋友可以参考下
    2022-07-07
  • Python使用QQ邮箱发送Email的方法实例

    Python使用QQ邮箱发送Email的方法实例

    实际开发过程中使用到邮箱的概率很高,那么如何借助python使用qq邮箱发送邮件呢?正好最近工作遇到这个需求,所以想着把方法分享出来方便大家,所以这篇文章主要介绍了Python使用QQ邮箱发送Email的实现方法,需要的朋友可以参考。
    2017-02-02
  • 聊聊PyTorch中eval和no_grad的关系

    聊聊PyTorch中eval和no_grad的关系

    这篇文章主要介绍了聊聊PyTorch中eval和no_grad的关系,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • python 装饰器带参数和不带参数步骤详解

    python 装饰器带参数和不带参数步骤详解

    装饰器是Python语言中一种特殊的语法,用于在不修改原函数代码的情况下,为函数添加额外的功能或修改函数的行为,这篇文章主要介绍了python装饰器带参数和不带参数的相关知识,需要的朋友可以参考下
    2024-05-05
  • python中比较两个列表的实例方法

    python中比较两个列表的实例方法

    在本篇文章里小编给各位分享了关于python中比较两个列表的实例方法以及相关代码,需要的朋友们参考下。
    2019-07-07
  • 基于Pytorch的神经网络之Regression的实现

    基于Pytorch的神经网络之Regression的实现

    本文主要介绍了基于Pytorch的神经网络之Regression的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • django模型类中,null=True,blank=True用法说明

    django模型类中,null=True,blank=True用法说明

    这篇文章主要介绍了django模型类中,null=True,blank=True用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Python两个整数相除得到浮点数值的方法

    Python两个整数相除得到浮点数值的方法

    这篇文章主要介绍了Python两个整数相除得到浮点数值的方法,本文直接给出代码示例,需要的朋友可以参考下
    2015-03-03

最新评论