一、数组转置的核心定义
转置是指调整数组维度的顺序,并重新排列元素的存储位置:
- 对二维数组(矩阵):转置就是 “行变列、列变行”(最直观的场景);
- 对高维数组(三维 / 四维):转置是按指定顺序重新排列维度(比如将 (维度0, 维度1, 维度2) 转为 (维度2, 维度1, 维度0))。
numpy 中实现转置的核心方式有 3 种(等价但适用场景不同):
| 方式 | 语法 | 特点 |
|---|---|---|
| 数组属性 t | arr.t | 最简洁,适合二维数组快速转置 |
| 方法 transpose() | arr.transpose(axes) | 灵活,可指定高维数组的维度顺序 |
| 函数 np.transpose() | np.transpose(arr, axes) | 等价于 arr.transpose(),函数式写法 |
二、基础用法:二维数组转置(最常用)
二维数组转置是日常开发中最常见的场景,对应数学中的 “矩阵转置”。
示例 1:用arr.t快速转置(推荐)
import numpy as np
# 原始二维数组(2行3列)
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
print("原始数组:\n", arr_2d)
print("原始形状:", arr_2d.shape) # (2, 3)
# 转置(行变列、列变行)
arr_t = arr_2d.t
print("\n转置后数组:\n", arr_t)
print("转置后形状:", arr_t.shape) # (3, 2)输出结果:
原始数组:
[[1 2 3]
[4 5 6]]
原始形状: (2, 3)
转置后数组:
[[1 4]
[2 5]
[3 6]]
转置后形状: (3, 2)
示例 2:用transpose()转置(等价于t)
# 二维数组转置时,transpose() 无参数等价于 arr.t
arr_trans = arr_2d.transpose()
print("transpose() 转置结果:\n", arr_trans) # 和 arr.t 完全一致三、进阶用法:高维数组转置(核心是维度顺序)
高维数组(三维 / 四维)的转置不再是简单的 “行变列”,而是按指定的维度顺序重新排列,这是新手最易混淆的点。
先明确:高维数组的维度编号
numpy 数组的维度从 0 开始编号,比如:
- 三维数组形状
(2, 3, 4)→ 维度 0=2、维度 1=3、维度 2=4; - 可理解为:
(样本数, 行数, 列数)或(通道数, 高度, 宽度)(图像场景)。
示例 1:三维数组转置(默认顺序)
transpose() 无参数时,高维数组会反转维度顺序(比如 (0,1,2) → (2,1,0)):
import numpy as np
# 原始三维数组:形状 (2, 3, 4) → 维度0=2,维度1=3,维度2=4
arr_3d = np.arange(24).reshape(2, 3, 4)
print("原始三维数组:\n", arr_3d)
print("原始形状:", arr_3d.shape) # (2, 3, 4)
# 无参数转置:维度顺序反转 (2,1,0) → 形状 (4, 3, 2)
arr_3d_t = arr_3d.transpose()
print("\n转置后形状:", arr_3d_t.shape) # (4, 3, 2)示例 2:指定维度顺序转置(核心!)
通过 transpose(axes) 参数指定维度顺序,实现灵活的维度调整:
import numpy as np
arr_3d = np.arange(24).reshape(2, 3, 4) # 维度0=2,维度1=3,维度2=4
# 需求:将维度顺序改为 (1, 0, 2) → 形状 (3, 2, 4)
arr_3d_trans1 = arr_3d.transpose(1, 0, 2)
print("维度顺序 (1,0,2) → 形状:", arr_3d_trans1.shape) # (3, 2, 4)
# 需求:将维度顺序改为 (0, 2, 1) → 形状 (2, 4, 3)
arr_3d_trans2 = arr_3d.transpose(0, 2, 1)
print("维度顺序 (0,2,1) → 形状:", arr_3d_trans2.shape) # (2, 4, 3)实战场景:图像数据转置(计算机视觉)
图像数据常见维度顺序有两种:
(高度, 宽度, 通道)(hwc,如 pil/opencv);(通道, 高度, 宽度)(chw,如 pytorch)。
转置可快速切换这两种格式:
import numpy as np
# 模拟图像数据:2张图片 × 32高度 × 32宽度 × 3通道(hwc格式,形状 (2,32,32,3))
img_hwc = np.random.randint(0, 255, (2, 32, 32, 3))
print("hwc格式形状:", img_hwc.shape) # (2, 32, 32, 3)
# 转置为chw格式:维度顺序 (0, 3, 1, 2) → 形状 (2, 3, 32, 32)
img_chw = img_hwc.transpose(0, 3, 1, 2)
print("chw格式形状:", img_chw.shape) # (2, 3, 32, 32)四、转置的核心特性:视图(共享内存)
和 reshape(-1) 类似,转置返回的是原数组的视图(view),而非新数组 —— 修改转置后的数组,会同步修改原数组(核心避坑点!)。
示例:验证共享内存
import numpy as np
arr = np.array([[1, 2], [3, 4]])
arr_t = arr.t # 转置视图
# 修改转置后的数组
arr_t[0, 1] = 99
print("转置数组修改后:\n", arr_t)
print("原数组同步修改:\n", arr) # 原数组的 [1,1] 位置变为99输出结果:
转置数组修改后:
[[ 1 99]
[ 2 4]]
原数组同步修改:
[[ 1 2]
[99 4]]
解决方法:若需要独立的转置数组,添加 .copy():
arr_t_indep = arr.t.copy()
arr_t_indep[0,1] = 0
print("独立转置数组修改后,原数组:\n", arr) # 原数组不变五、转置的常见应用场景
场景 1:矩阵运算(线性代数)
矩阵乘法要求 “第一个矩阵的列数 = 第二个矩阵的行数”,转置是调整维度的关键:
import numpy as np
# 矩阵a:2行3列
a = np.array([[1,2,3], [4,5,6]])
# 矩阵b:3行2列(a的转置)
b = a.t
# 矩阵乘法:a × b → 2行2列
c = np.dot(a, b)
print("a × a.t 的结果:\n", c)场景 2:数据按列 / 行统计
转置可将 “按行存储” 的数据转为 “按列存储”,方便统计:
import numpy as np
# 原始数据:31天×24小时温度(按行存储,每行是1天)
temp = np.random.normal(5, 6, (31, 24)).round(1)
# 需求:统计每小时的平均温度(按列统计)
# 方法1:直接按列统计
hour_mean1 = temp.mean(axis=0)
# 方法2:转置后按行统计(等价)
hour_mean2 = temp.t.mean(axis=1)
print("每小时平均温度(方法1):", hour_mean1[:5])
print("每小时平均温度(方法2):", hour_mean2[:5]) # 结果一致场景 3:广播配合转置
转置可调整数组形状,让广播更灵活:
import numpy as np
# 数组a:2行3列
a = np.array([[1,2,3], [4,5,6]])
# 数组b:2个元素(想按列和a相加)
b = np.array([10, 20])
# 直接相加:b会被广播为(2,1),和a的(2,3)相加 → 每行加对应值
# 需求:每列加对应值 → 先转置a,相加后再转置
a_t = a.t + b # a.t是(3,2),b是(2,) → 广播为(3,2),逐行相加
a_new = a_t.t
print("每列加对应值的结果:\n", a_new)输出结果:
每列加对应值的结果:
[[11 12 13]
[24 25 26]]
六、避坑点与最佳实践
1. 核心避坑点
- ❌ 误区:转置会创建新数组(实际是视图,共享内存,需独立则加 .copy());
- ❌ 误区:高维数组转置无参数时和二维一样(实际是反转维度顺序);
- ❌ 错误:指定无效的维度顺序(如三维数组指定 transpose(3,1,2),维度编号超出范围);
- ❌ 混淆:转置和 reshape(转置改变元素排列,reshape 仅改变形状,元素顺序不变)。
2. 最佳实践
- ✅ 二维数组转置优先用 arr.t(简洁高效);
- ✅ 高维数组转置明确维度顺序(如 transpose(0,3,1,2)),避免依赖默认反转;
- ✅ 需独立数组时,转置后加 .copy();
- ✅ 验证转置结果:通过 shape 属性检查维度是否符合预期。
总结
- 数组转置核心是调整维度顺序:二维数组是 “行变列”,高维数组是按指定顺序重排维度;
- 实现方式:arr.t(二维首选)、arr.transpose(axes)(高维灵活)、np.transpose()(函数式);
- 核心特性:转置返回视图(共享内存),修改会同步影响原数组,需独立则加 .copy();
- 常用场景:矩阵运算、图像格式转换、广播配合调整维度、按列 / 行统计数据;
- 避坑关键:区分转置和 reshape,高维转置明确维度顺序,验证形状是否符合预期。
到此这篇关于numpy中数组的转置transpose的三种方法的文章就介绍到这了,更多相关numpy数组转置transpose内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论