本篇内容主要讲解“numpy多级排序lexsort函数如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“numpy多级排序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。
默认你已经理解了,那就举一个例子来过一遍:
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函数如何使用”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。