您的位置:首页 >NumPy中数组的转置Transpose的三种方法
发布于2026-05-02 阅读(0)
扫一扫,手机访问
说到数组转置,听起来有点抽象,但它的核心动作其实很明确:调整数组维度的顺序,并重新排列元素的存储位置。先来看一张图,能帮你快速建立直观印象:

在NumPy里,实现这个操作主要有三种方式,它们功能等价,但各有各的适用场景:
| 方式 | 语法 | 特点 |
|---|---|---|
| 数组属性 T | arr.T | 写法最简洁,处理二维数组转置时的首选 |
| 方法 transpose() | arr.transpose(axes) | 功能最灵活,可以精确指定高维数组的维度顺序 |
| 函数 np.transpose() | np.transpose(arr, axes) | 与上一种方法等价,只是换成了函数式的调用风格 |
二维数组的转置,对应着线性代数里的矩阵转置,是日常数据操作中最常碰到的场景,理解起来也最简单。
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)
# 二维数组转置时,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。(样本数, 行数, 列数),或者在图像处理中,理解为(通道数, 高度, 宽度)。当你不给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)
这才是高维转置的威力所在。通过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类似,转置操作返回的是原数组的一个视图(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) # 原数组不变
进行矩阵乘法时,要求前一个矩阵的列数等于后一个矩阵的行数。转置是快速调整维度以满足这个要求的关键工具。
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)
当数据按行存储,但你需要按列进行统计(比如计算每列的平均值)时,转置可以让问题变得更直观。
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]) # 结果一致
转置可以巧妙地调整数组形状,使其更好地符合广播机制的规则,实现更灵活的运算。
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]]
.copy()。transpose(3,1,2),维度编号超出了范围。arr.T。 写法简洁,意图明确。transpose(0,3,1,2)的明确参数,避免依赖容易混淆的默认反转。.copy()。 这是保证数据安全性的好习惯。.shape属性检查维度是否符合预期。arr.T(二维首选)、arr.transpose(axes)(高维灵活控制)、np.transpose()(函数式写法)。.copy()。.shape来确保结果万无一失。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9