作用
张量的 .T 属性是 torch.transpose() 函数的简化版,核心作用是:对张量进行转置操作(行列互换),返回原张量的视图(view)而非副本(即修改转置后的张量会影响原张量)。
- 对二维张量(矩阵):
.T等价于torch.transpose(tensor, 0, 1),实现经典的矩阵转置(行变列、列变行); - 对一维张量:
.T无效果(返回自身); - 对高维张量:
.T等价于反转所有维度的顺序(如 3 维张量shape [a,b,c]转置后为[c,b,a],但高维转置更推荐用transpose/permute)。
例子
import torch
# 示例1:二维张量(矩阵)转置(最常用场景)
x = torch.tensor([[1, 2, 3],
[4, 5, 6]]) # shape [2, 3](2行3列)
x_T = x.T # 转置
print("原张量:\n", x)
print("转置后张量:\n", x_T)
# 输出:
# tensor([[1, 4],
# [2, 5],
# [3, 6]]) # shape [3, 2](3行2列)
print("转置后形状:", x_T.shape) # torch.Size([3, 2])
# 示例2:一维张量转置(无效果)
y = torch.tensor([1, 2, 3]) # shape [3]
y_T = y.T
print("一维张量转置后:", y_T) # tensor([1, 2, 3])
print("形状不变:", y_T.shape) # torch.Size([3])
# 示例3:高维张量转置(反转所有维度,不推荐这么用)
z = torch.randn(2, 3, 4) # shape [2,3,4]
z_T = z.T
print("高维张量转置后形状:", z_T.shape) # torch.Size([4,3,2])(维度顺序完全反转)
返回视图(内存共享)
.T 不会创建新的张量,而是返回原张量的“视图”,修改转置后的张量会同步修改原张量:
x = torch.tensor([[1,2],[3,4]])
x_T = x.T
# 修改转置后的张量
x_T[0,1] = 100
print("转置后张量:\n", x_T)
# tensor([[ 1, 100],
# [ 2, 4]])
print("原张量(同步修改):\n", x)
# tensor([[ 1, 2],
# [100, 4]])
提示:如果需要独立的转置张量(不共享内存),可加 .clone():x_T = x.T.clone()。
与 transpose() 的区别
.T 是 transpose() 的简化版,但灵活性不如后者,二者对比:
| 操作 | 适用场景 | 灵活性 | 示例(二维张量) |
|---|---|---|---|
tensor.T |
二维张量转置(0和1维互换) | 低 | x.T 等价于 x.transpose(0,1) |
torch.transpose(tensor, dim0, dim1) |
任意指定两个维度互换 | 高 | 三维张量转置:z.transpose(0,2)(仅互换0和2维) |
# 三维张量:用 transpose 指定维度互换(更合理)
z = torch.randn(2, 3, 4) # shape [2,3,4]
# 仅互换0和2维(保留1维)
z_trans = z.transpose(0, 2)
print("transpose后形状:", z_trans.shape) # torch.Size([4,3,2])
# .T 是反转所有维度(0→2, 1→1, 2→0),等价于 transpose(0,2) 但语义不清晰
print(".T 后形状:", z.T.shape) # torch.Size([4,3,2])
可求梯度的张量转置
如果原张量开启了 requires_grad=True(可训练参数),转置后的张量仍保留梯度属性:
x = torch.tensor([[1.0, 2.0], [3.0, 4.0]], requires_grad=True)
x_T = x.T
# 模拟计算梯度
y = x_T.sum()
y.backward()
print("原张量的梯度:\n", x.grad)
# tensor([[1., 1.],
# [1., 1.]])(转置不影响梯度计算)
应用场景
(1)矩阵运算中的转置
比如计算矩阵的内积、批量向量点积时,常需要转置:
# 场景:两个批量向量(shape [batch, dim])计算点积
batch_vec1 = torch.randn(4, 5) # 4个向量,每个5维
batch_vec2 = torch.randn(4, 5)
# 点积:(4,5) × (5,4) → 需转置其中一个
dot_product = batch_vec1 @ batch_vec2.T
print("批量点积结果形状:", dot_product.shape) # torch.Size([4,4])
(2)数据维度调整
处理图像/序列数据时,偶尔需要转置调整维度(但高维更推荐 permute):
# 模拟:图像张量 shape [H, W, C] → 转置为 [C, H, W](PyTorch 常用格式)
img = torch.randn(28, 28, 3) # 28×28像素,3通道
img_T = img.T # 转置后 shape [3,28,28]
print("图像转置后形状:", img_T.shape) # torch.Size([3,28,28])
总结
.T是 PyTorch 张量的转置属性,对二维张量等价于transpose(0,1)(行列互换),是最简洁的矩阵转置方式。- 核心特性:返回原张量的视图(共享内存),需独立张量则加
.clone();一维张量转置无效果,高维张量转置推荐用transpose/permute。 - 适用场景:二维矩阵转置(如矩阵运算、简单维度调整),高维张量转置优先用
torch.transpose()明确指定维度。