NumPy提供了多个用于数组翻转的函数,其中np.flip可以指定任意轴进行翻转,np.fliplr和np.flipud则分别用于二维数组的左右翻转和上下翻转,在处理图像这类高维数组时,需要结合数组的维度结构选择合适的函数。

NumPy翻转函数的基本用法
np.flip函数
np.flip是通用的数组翻转函数,支持指定任意轴进行翻转,函数语法如下:
import numpy as np
# 创建一个3维数组,形状为(2,3,4),可模拟2张3行4列的单通道图像
arr = np.arange(24).reshape(2, 3, 4)
print("原始数组形状:", arr.shape)
# 沿轴0翻转,即翻转第一个维度
flipped_axis0 = np.flip(arr, axis=0)
print("沿轴0翻转后形状:", flipped_axis0.shape)
# 沿轴2翻转,即翻转最后一个维度
flipped_axis2 = np.flip(arr, axis=2)
print("沿轴2翻转后形状:", flipped_axis2.shape)
axis参数指定要翻转的轴,默认值为None,此时会翻转所有轴。对于三维数组,轴0通常对应批次维度,轴1对应行维度,轴2对应列维度,如果是图像数组带通道维度,轴3则对应通道维度。
np.fliplr和np.flipud函数
这两个函数是针对二维数组的专用翻转函数,np.fliplr实现左右翻转(沿列轴翻转),np.flipud实现上下翻转(沿行轴翻转),二者本质上是np.flip的特殊情况:
# 创建二维数组
arr_2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
# 左右翻转
fliplr_res = np.fliplr(arr_2d)
# 上下翻转
flipud_res = np.flipud(arr_2d)
print("原始二维数组:n", arr_2d)
print("左右翻转结果:n", fliplr_res)
print("上下翻转结果:n", flipud_res)
需要注意的是,这两个函数仅支持二维及以下数组,对三维及以上数组使用会直接报错。
图像通道翻转的实际应用
图像数据通常存储为形状为(高度, 宽度, 通道数)的三维数组,或者(批次大小, 高度, 宽度, 通道数)的四维数组,通道顺序常见的有RGB和BGR,有时需要翻转通道顺序完成格式转换。
翻转图像通道维度
如果要将RGB图像转换为BGR图像,只需要翻转通道所在的轴即可,通常通道维度是最后一个轴(轴2对于三维图像数组,轴3对于四维批量图像数组):
# 模拟一张2x2的RGB图像,通道顺序为R、G、B
rgb_image = np.array([
[[255, 0, 0], [0, 255, 0]],
[[0, 0, 255], [255, 255, 255]]
])
print("原始RGB图像形状:", rgb_image.shape)
# 翻转通道轴(轴2),得到BGR图像
bgr_image = np.flip(rgb_image, axis=2)
print("翻转通道后BGR图像:n", bgr_image)
结合翻转函数处理图像
如果需要对图像同时做水平翻转和通道翻转,可以先使用np.fliplr处理二维的图像内容,再翻转通道维度,不过需要注意np.fliplr仅支持二维数组,因此需要先提取单张图像再处理:
# 模拟单张RGB图像,形状(2,2,3)
single_image = np.array([
[[255, 0, 0], [0, 255, 0]],
[[0, 0, 255], [255, 255, 255]]
])
# 先提取高度和宽度维度做左右翻转,再拼接通道维度
height, width, channels = single_image.shape
# 对前两个维度做左右翻转,需要先将数组视为二维的高度x(宽度*通道)结构?不对,正确做法是先取前两个维度
# 正确方式:先对图像的行和列做左右翻转,再翻转通道
# 左右翻转行和列维度,即沿宽度轴翻转,对应轴1
flipped_lr = np.fliplr(single_image) # 这里np.fliplr会自动处理最后一维?不对,np.fliplr要求二维,所以会报错,正确做法是用np.flip指定轴1
# 正确写法
flipped_lr_correct = np.flip(single_image, axis=1)
# 再翻转通道
final_image = np.flip(flipped_lr_correct, axis=2)
print("水平翻转+通道翻转后图像:n", final_image)
这里需要注意,np.fliplr不能直接处理三维数组,因此对于高维图像数组,优先使用np.flip指定对应的轴来完成操作,避免函数报错。
不同翻转函数的适用场景对比
可以通过下表快速判断不同场景下应该使用的函数:
| 场景 | 推荐函数 | 参数说明 |
|---|---|---|
| 二维数组左右翻转 | np.fliplr或np.flip(arr, axis=1) | axis=1对应二维数组的列维度 |
| 二维数组上下翻转 | np.flipud或np.flip(arr, axis=0) | axis=0对应二维数组的行维度 |
| 高维数组指定任意轴翻转 | np.flip | 根据数组维度指定axis参数 |
| 图像通道顺序翻转 | np.flip | axis指定为通道所在的轴,通常是最后一个轴 |
掌握这几个函数的用法后,就可以灵活处理NumPy高维数组的翻转需求,尤其是在图像预处理场景中,能够快速完成通道转换、图像镜像等操作。
NumPynp_flipnp_fliplrnp_flipud高维数组翻转修改时间:2026-07-03 17:06:44