基于数值排序生成新数组:NumPy二维数组按首列排序异常
代码输出错位的根因
你遇到的元素匹配错误问题,本质是对numpy两个基础运行机制的预期偏差,具体拆解为两点:
- 切片生成的是内存视图,而非独立副本
a[::-1]不会为数组复制独立的内存空间,只是生成一个从尾到头遍历原数组的访问视图,和原数组完全共享底层存储。在这个视图上调用.sort()这类原地修改方法,操作会直接作用到原数组的内存上,完全不是你预期的“先生成原数组的倒序副本,再在副本上执行排序”。 - axis=0的排序逻辑不会绑定整行元素
调用.sort(axis=0)时,numpy的排序规则是逐列独立完成升序排列,不会把每一行的两个元素视为绑定的整体移动。排序过程中第一列、第二列的元素是各自独立重新排布的,从根源上就不保证同一行的两个元素来自原数组的同一行——这正是你看到元素被错位拼接的核心原因。
符合预期的排序实现
你的需求本质是:把每个长度为2的子数组作为最小排序单元,优先按子数组的第一个值降序排列,首值相同的组内按第二个值降序排列,全程不打破子数组内部的元素绑定关系。
可直接复用的实现代码:
import numpy as np a = np.array([[1,1],[1, 0],[0, 0],[0, 0],[0, 0],[1, 1],[1, 1],[0, 1]]) # 构造复合排序优先级:优先按第一列降序排序,同值时按第二列降序 sort_idx = np.lexsort((-a[:, 1], -a[:, 0])) sorted_array = a[sort_idx]
运行后输出的排序结果和你的目标完全匹配:
[[1 1] [1 1] [1 1] [1 0] [0 1] [0 0] [0 0] [0 0]]
内容的提问来源于stack exchange,提问作者soulwreckedyouth
相关产品推荐
相关产品推荐

