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() 的核心就是重新排列维度,保持数据本身不变。通过指定新维度的顺序,可以调整张量的形状和访问方式,用于数据处理和模型输入等场景。

相关推荐
未来之窗软件服务21 小时前
幽冥大陆(九十三 ) PHP分词服务源码 —东方仙盟练气期
人工智能·nlp·仙盟创梦ide·东方仙盟·分词服务
t1987512821 小时前
神经网络控制的多方法融合:PID、模型预测控制(MPC)与自适应策略
人工智能·深度学习·神经网络
青主创享阁21 小时前
技术破局制造业民企困局:玄晶引擎的AI赋能路径与实践逻辑
人工智能
智慧化智能化数字化方案21 小时前
数据资产管理进阶——解读数据资产管理体系建设【附全文阅读】
大数据·人工智能·数据资产管理·数据资产管理体系建设·数据要素入表
沛沛老爹21 小时前
Web开发者快速上手AI Agent:基于Function Calling的12306自动订票系统实战
java·人工智能·agent·web转型
海棠AI实验室21 小时前
第十七章 调试与排错:读懂 Traceback 的方法论
python·pandas·调试
EchoL、21 小时前
浅谈当下深度生成模型:从VAE、GAN、Diffusion、Flow Matching到世界模型
人工智能·神经网络·生成对抗网络
凤希AI伴侣21 小时前
深度优化与开源力量-凤希AI伴侣-2026年1月6日
人工智能·凤希ai伴侣
deephub21 小时前
Agentic RAG:用LangGraph打造会自动修正检索错误的 RAG 系统
人工智能·大语言模型·rag·langgraph
2501_9418787421 小时前
在奥克兰云原生实践中构建动态配置中心以支撑系统稳定演进的工程经验总结
开发语言·python