pytorch小记(四):pytorch中的重排操作:x.permute()
- 1. 初始张量 `x`
- 2. 调用 `permute` 的原理
- 案例分析
- 2.1 `z = x.permute(0, 2, 1)`
- 2.2 `z = x.permute(1, 0, 2)`
- 2.3 `z = x.permute(1, 2, 0)`
- 2.4 `z = x.permute(2, 0, 1)`
- 2.5 `z = x.permute(2, 1, 0)`
- 总结
在 PyTorch 中,permute
是一种对张量维度重新排列的方法。它不会更改数据,而是根据指定的顺序交换维度的位置。
1. 初始张量 x
代码:
python">x = torch.arange(6).reshape(1, 2, 3)
print(x)
输出:
tensor([[[0, 1, 2],[3, 4, 5]]])
x
的形状是(1, 2, 3)
:- 第 0 维:长度为 1,对应的是最外层的维度(块)。
- 第 1 维:长度为 2,对应的是行数。
- 第 2 维:长度为 3,对应的是列数。
2. 调用 permute
的原理
permute
的参数是新维度的顺序。- 每个参数表示原始维度的索引,
permute(a, b, c)
意味着:- 原第
a
维变为新第 0 维。 - 原第
b
维变为新第 1 维。 - 原第
c
维变为新第 2 维。
- 原第
具体计算时,张量的内容 不变,只是维度排列的方式发生了变化。
案例分析
2.1 z = x.permute(0, 2, 1)
代码:
python">z = x.permute(0, 2, 1)
print(z)
解释:
permute(0, 2, 1)
表示:- 第 0 维保持不变。
- 第 2 维变为第 1 维。
- 第 1 维变为第 2 维。
原张量:
x = [[[0, 1, 2], [3, 4, 5]]] # 第 0 维:行 ([[0, 1, 2], [3, 4, 5]])
# 第 1 维:行 ([0, 1, 2], [3, 4, 5])
# 第 2 维:列 ([0, ..., 3], [1, ..., 4], [2, ..., 5])
调整后张量:
- 第 0 维(块):仍为
[[0, 1, 2], [3, 4, 5]]
。 - 第 1 维:原来的列
[0, ..., 3]
,[1, ..., 4]
和[2, ..., 5]
变为行。 - 第 2 维:原来的行
[0, 1, 2]
和[3, 4, 5]
变为列。
结果:
tensor([[[0, 3],[1, 4],[2, 5]]])
2.2 z = x.permute(1, 0, 2)
代码:
python">z = x.permute(1, 0, 2)
print(z)
解释:
permute(1, 0, 2)
表示:- 第 1 维变为第 0 维。
- 第 0 维变为第 1 维。
- 第 2 维保持不变。
原张量:
x = [[[0, 1, 2], [3, 4, 5]]] # 第 0 维:行 ([[0, 1, 2], [3, 4, 5]])
# 第 1 维:行 ([0, 1, 2], [3, 4, 5])
# 第 2 维:列 ([0, ..., 3], [1, ..., 4], [2, ..., 5])
结果:
tensor([[[0, 1, 2]],[[3, 4, 5]]])
- 第 0 维(原第 1 维):行数变成了最外层维度。
- 第 1 维(原第 0 维):长度为 1。
- 第 2 维保持不变。
2.3 z = x.permute(1, 2, 0)
代码:
python">z = x.permute(1, 2, 0)
print(z)
解释:
permute(1, 2, 0)
表示:- 第 1 维变为第 0 维。
- 第 2 维变为第 1 维。
- 第 0 维变为第 2 维。
原张量:
x = [[[0, 1, 2], [3, 4, 5]]] # 第 0 维:行 ([[0, 1, 2], [3, 4, 5]])
# 第 1 维:行 ([0, 1, 2], [3, 4, 5])
# 第 2 维:列 ([0, ..., 3], [1, ..., 4], [2, ..., 5])
结果:
tensor([[[0],[1],[2]],[[3],[4],[5]]])
- 第 0 维(原第 1 维):行数变成了最外层维度。
- 第 1 维(原第 2 维):列数变成了行。
- 第 2 维(原第 0 维):长度为 1。
2.4 z = x.permute(2, 0, 1)
代码:
python">z = x.permute(2, 0, 1)
print(z)
解释:
permute(2, 0, 1)
表示:- 第 2 维变为第 0 维。
- 第 0 维变为第 1 维。
- 第 1 维变为第 2 维。
原张量:
x = [[[0, 1, 2], [3, 4, 5]]] # 第 0 维:行 ([[0, 1, 2], [3, 4, 5]])
# 第 1 维:行 ([0, 1, 2], [3, 4, 5])
# 第 2 维:列 ([0, ..., 3], [1, ..., 4], [2, ..., 5])
结果:
tensor([[[0, 3]],[[1, 4]],[[2, 5]]])
- 第 0 维(原第 2 维):列数变成最外层维度。
- 第 1 维(原第 0 维):长度为 1。
- 第 2 维(原第 1 维):行数保持不变。
2.5 z = x.permute(2, 1, 0)
代码:
python">z = x.permute(2, 1, 0)
print(z)
解释:
permute(2, 1, 0)
表示:- 第 2 维变为第 0 维。
- 第 1 维保持不变。
- 第 0 维变为第 2 维。
结果:
tensor([[[0],[3]],[[1],[4]],[[2],[5]]])
- 第 0 维(原第 2 维):列数变成最外层维度。
- 第 1 维(原第 1 维):行数保持不变。
- 第 2 维(原第 0 维):长度为 1。
总结
x.permute()
的核心就是重新排列维度,保持数据本身不变。通过指定新维度的顺序,可以调整张量的形状和访问方式,用于数据处理和模型输入等场景。