如何按多索引不同顺序排序numpy数组,解决lexsort降序失效问题
问题原因与解决方案
错误原因
你代码中对二级列使用arr[:,1][::-1]的操作并不能实现降序排序的效果:该操作是将第1列的所有元素按行顺序整体倒转,相当于传入lexsort的键值和原行的对应关系被打乱,完全不会改变该列的排序升降规则,所以达不到预期效果。
正确实现逻辑
numpy的lexsort默认对所有键执行升序排序,要实现某列的降序排序,仅需对数值型的该列取相反数作为排序键即可:升序排列相反数的效果完全等价于原数值的降序排列。
同时要注意lexsort的键参数规则:传入的键元组中,越靠后的键排序优先级越高,优先级顺序从右到左依次降低。
你需要的排序规则对应代码如下:
# 键顺序:(最低优先级键, 次优先级键, 最高优先级主键) idx = np.lexsort((arr[:,3], -arr[:,1], arr[:,4])) arr = arr[idx]
效果验证示例
你可以用小型测试数组验证排序效果:
import numpy as np # 构造5列测试数组 arr = np.array([ [1, 5, 9, 4, 2], [2, 7, 1, 6, 1], [3, 7, 8, 2, 1], [4, 3, 5, 1, 2] ]) idx = np.lexsort((arr[:,3], -arr[:,1], arr[:,4])) print(arr[idx])
输出结果会严格按照规则排序:
- 先按第4列升序排列,第4列为1的行在前,为2的行在后
- 第4列相同的行按第1列降序排列,第1列值7的行排在3、5前面
- 前两列都相同的行按第3列升序排列,第3列值为2的行排在6前面
内容的提问来源于stack exchange,提问作者Rohan
相关产品推荐
相关产品推荐

