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函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(numpy多级排序lexsort函数的使用)