该用 fliplr 时是需沿水平轴(列方向)翻转二维数组;它不支持一维数组,对高维数组仅作用于最后两轴,且返回新数组(可能是视图或副本),切片写法 arr[:, ::-1] 更直观安全。

什么时候该用 fliplr 而不是 flipud
fliplr 只对二维数组生效,作用是沿水平轴(列方向)翻转,即每行的元素顺序被反转;flipud 是沿垂直轴(行方向)翻转,即上下颠倒行序。一维数组传给 fliplr 会直接报错:ValueError: Input must be >= 2-d.。如果你手头是个 shape 为 (n,) 的向量,想左右翻转——它根本没“左右”可言,得先用 reshape(1, -1) 或 np.expand_dims 升维,再调 fliplr,最后 squeeze 回去。
fliplr 在三维及以上数组中会怎样
它只处理最后两个轴,等价于 np.flip(a, axis=(-1,)) —— 注意,不是 axis=(-2, -1)。比如一个 shape 为 (2, 3, 4) 的数组,fliplr 仅对每个 (3, 4) 切片做列翻转,不碰第一个维度。这和直觉可能不符:名字叫“左右”,但实际行为由数组维度隐式决定。若你误以为它会翻转“最外层”的左右(比如把 batch 维度首尾调换),就会出错。真正通用、可控的方式是显式用 np.flip(arr, axis=1)(指定第 1 轴)或 np.flip(arr, axis=-1)(指定最后一轴)。
性能与内存:fliplr 是原地操作吗
不是。它返回的是新数组,原始数组不变。底层调用的是 np.flip,而 np.flip 返回的是视图(view)还是副本(copy),取决于是否涉及内存连续性调整。例如对 C 连续的二维数组用 fliplr,返回的是 view(共享内存);但若原数组是 F 连续或做了切片导致非连续,就可能触发 copy。这点容易被忽略——你以为在原地改,其实悄悄占了双倍内存。如需确保不复制,可用 np.ascontiguousarray 预处理;如明确要原地修改,只能手动索引赋值:arr[:] = arr[:, ::-1]。
替代写法比函数调用更直观的场景
很多情况下,用切片比记函数名更快更安全:
- 左右翻转二维数组:
arr[:, ::-1](清晰表明“所有行,列倒序”) - 上下翻转:
arr[::-1, :] - 三维数组按最后一维翻转:
arr[..., ::-1]
这些写法不依赖函数语义记忆,不报维度错误,且 IDE 能更好提示。只有当代码需强调语义(如教学、接口封装)时,才考虑 fliplr / flipud。顺便提一句:np.rot90(arr, k=2) 也能实现左右+上下双重翻转,但它是绕 Z 轴旋转,开销更大,纯属炫技,别在热路径里用。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











