最安全的方式是用[:, -n:]取最后n列,它在二维数组中全取第一轴、第二轴从倒数第n个起切片,返回二维子数组;高维用[..., -n:]更通用,切片默认返回视图。

用 [:, -n:] 直接切最后 n 列最安全
NumPy 多维数组(比如二维 ndarray)中“最后几列”本质是按第二轴(axis=1)取末尾切片。最常用也最不容易出错的方式就是 [:, -n:] —— 第一维全取,第二维从倒数第 n 个开始到末尾。
注意:-n 不是“倒数第 n 列”,而是“索引为 -n 的位置起始”,所以 [:, -2:] 是取最后两列(索引 -2 和 -1),不是只取第 -2 列。
常见错误现象:arr[:, -2] 返回一维向量(最后一列的第 2 个元素?错!是倒数第 2 列整列),而 arr[:, -2:] 才返回二维子数组(含列结构)。
-
arr = np.arange(12).reshape(3, 4)→ shape (3, 4),列索引为 0,1,2,3;-1对应 3,-2对应 2 -
arr[:, -2:]→ 取列索引 2 和 3,结果 shape 为 (3, 2) - 若
n > arr.shape[1],如arr[:, -10:],NumPy 自动截断为[:, :],不会报错但可能掩盖逻辑问题
负数步长 ::-1 不适合“取最后几列”,容易混淆
负数步长(如 [:, ::-1])作用是**反转整个轴方向**,不是“定位末尾”。想用它来“取最后两列再反转”,得组合多个操作,反而绕远且易错。
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
例如:arr[:, -2:][::-1] 是先取最后两列、再把行顺序翻转;而 arr[:, -2::-1] 完全不是你想要的——因为切片 -2::-1 会从索引 -2 开始往前走到开头(即列 2→1→0),根本不是“最后两列”。
-
arr[:, -2::-1]等价于arr[:, 2::-1](负索引在切片起点被解析为正),结果是列 2、1、0(共三列),顺序还反了 - 真正需要“最后两列且列顺序不变”,就别碰
::-1在列维度上做文章 - 如果真要反转列顺序(比如把最后两列调换位置),应该先切再显式重排:
arr[:, [-1, -2]]
高维张量(3D+)要用 ..., -n: 显式指定轴
对三维数组 arr(shape 比如 (5, 6, 7)),说“最后几列”默认指最内层维度(axis=-1)。这时不能写 [:, :, -2:] —— 虽然能跑,但可读性差、不通用;更清晰的是用省略号 ... 表示前面所有轴。
arr[..., -2:] 明确表达“在最后一个轴上取最后两元素”,不管张量是 2D、3D 还是 4D 都适用,也避免硬编码维度数出错。
-
arr = np.random.rand(2, 3, 4, 5)→arr[..., -2:]shape 为 (2, 3, 4, 2) - 误写成
arr[:, :, :, -2:]在 4D 时看似没问题,但一旦维度变(比如 batch 增加一维),就得手动改切片长度 -
...是 NumPy 原生语法,不是 magic,性能无损耗
用 np.take 或高级索引时要注意返回视图还是副本
切片(如 [:, -2:])默认返回**视图(view)**,修改它会联动原数组;而 np.take(arr, indices, axis=1) 或布尔索引等高级索引方式,通常返回**副本(copy)**。
如果你后续要原地修改提取出的数据,并希望影响原始张量,必须确认操作是否产生视图。否则可能白改了。
-
last_two = arr[:, -2:]→ 视图,last_two[0, 0] = 999会改arr对应位置 -
last_two = np.take(arr, [-2, -1], axis=1)→ 副本,改它不影响arr - 不确定时,用
last_two.base is arr检查是否为视图(返回True表示是)
[:, -n:] 或 [..., -n:] 就够了;负数步长在列提取里基本是干扰项;高维下省略号不是炫技,是防止维度错位的必要习惯。

















