pytorch小记(四):pytorch中的重排操作:x.permute()

pytorch小记(四):pytorch中的重排操作:x.permute()

      • [1. 初始张量 `x`](#1. 初始张量 x)
      • [2. 调用 `permute` 的原理](#2. 调用 permute 的原理)
      • 案例分析
        • [2.1 `z = x.permute(0, 2, 1)`](#2.1 z = x.permute(0, 2, 1))
        • [2.2 `z = x.permute(1, 0, 2)`](#2.2 z = x.permute(1, 0, 2))
        • [2.3 `z = x.permute(1, 2, 0)`](#2.3 z = x.permute(1, 2, 0))
        • [2.4 `z = x.permute(2, 0, 1)`](#2.4 z = x.permute(2, 0, 1))
        • [2.5 `z = x.permute(2, 1, 0)`](#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() 的核心就是重新排列维度,保持数据本身不变。通过指定新维度的顺序,可以调整张量的形状和访问方式,用于数据处理和模型输入等场景。

相关推荐
我材不敲代码3 小时前
Python实现打包贪吃蛇游戏
开发语言·python·游戏
0思必得05 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
水如烟5 小时前
孤能子视角:“组织行为学–组织文化“
人工智能
韩立学长5 小时前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
大山同学5 小时前
图片补全-Context Encoder
人工智能·机器学习·计算机视觉
qq_192779875 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
薛定谔的猫19825 小时前
十七、用 GPT2 中文对联模型实现经典上联自动对下联:
人工智能·深度学习·gpt2·大模型 训练 调优
u0109272715 小时前
使用Plotly创建交互式图表
jvm·数据库·python
爱学习的阿磊5 小时前
Python GUI开发:Tkinter入门教程
jvm·数据库·python
壮Sir不壮5 小时前
2026年奇点:Clawdbot引爆个人AI代理
人工智能·ai·大模型·claude·clawdbot·moltbot·openclaw