按列排序(axis=0)是对每列独立升序,保持行结构不变;按行排序(axis=1)是对每行独立升序,保持行列数不变;而按某列值整行重排需用argsort或lexsort索引法,非axis参数所能实现。

多维数组排序时,“按行排序”和“按列排序”指的是沿不同轴(axis)对数据进行独立排序,而不是整体打乱重排。关键在于理解 axis 参数的含义:在 NumPy 中,axis=0 表示按列操作(即对每一列内部排序),axis=1 表示按行操作(即对每一行内部排序)。这容易和日常语言中的“按行”直觉相反,需特别注意。
按列排序(axis=0):每列独立升序
该操作保持行间结构不变,但让每列内的元素从小到大排列。适合需要统一各特征列尺度、或做列归一化前的预处理。
- 使用
np.sort(arr, axis=0)返回新数组,原数组不变 - 使用
arr.sort(axis=0)原地修改,不返回值 - 例如:
arr = [[3, 1], [1, 4], [2, 2]]→ 按列排序后变为[[1, 1], [2, 2], [3, 4]](第0列变成 [1,2,3],第1列变成 [1,2,4])
按行排序(axis=1):每行独立升序
该操作保持行数和列数不变,但将每行内部元素重新排列为升序。适合对样本内多个指标单独标准化,或准备输入某些要求行内有序的算法。
-
np.sort(arr, axis=1)对每行分别排序 - 原数组
[[3, 1], [1, 4], [2, 2]]→ 排序后为[[1, 3], [1, 4], [2, 2]] - 注意:这种排序会破坏行内原始变量间的逻辑关系(如坐标点 [x,y] 排序后可能变成 [y,x])
不能直接用 axis 实现的“按某列值排序整行”
如果目标是“按第0列数值大小,把整行当作一个单元来重排”,这不是 axis=0 或 axis=1 能完成的——那属于行间排序,需用 np.lexsort 或 argsort 配合索引。
- 例如按第一列升序重排所有行:
idx = np.argsort(arr[:, 0]); sorted_arr = arr[idx] - 多条件排序(先按第0列,再按第1列):
idx = np.lexsort((arr[:, 1], arr[:, 0]));注意参数顺序是“次要键在前,主要键在后” - 这种排序保留每行完整性,常用于表格类数据整理
小提醒:别混淆“排序方向”和“排序依据”
axis 控制的是排序作用范围(哪一维被独立排序),不是排序依据。要按某列数值决定整行顺序,必须用索引法(argsort/lexsort),而非 axis 参数。两者解决的是完全不同的问题。











