pytorch api文档:张量的 .T 属性(转置操作、行列互换)

作用

张量的 .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])

总结

  1. .T 是 PyTorch 张量的转置属性,对二维张量等价于 transpose(0,1)(行列互换),是最简洁的矩阵转置方式。
  2. 核心特性:返回原张量的视图(共享内存),需独立张量则加 .clone();一维张量转置无效果,高维张量转置推荐用 transpose/permute。
  3. 适用场景:二维矩阵转置(如矩阵运算、简单维度调整),高维张量转置优先用 torch.transpose() 明确指定维度。

原文出处:/show_1GW2bqHciyO0.html