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

相关推荐
MarkHD5 分钟前
Dify从入门到精通 第16天 工作流进阶 - 分支与判断:构建智能路由客服机器人
人工智能·机器人
意疏9 分钟前
从告警风暴到根因定位:SigNoz+CPolar让分布式系统观测效率提升10倍的实战指南
人工智能
独行soc15 分钟前
2025年渗透测试面试题总结-106(题目+回答)
网络·python·安全·web安全·adb·渗透测试·安全狮
千与千寻酱25 分钟前
排列与组合在编程中的实现:从数学概念到代码实践
前端·python
新智元27 分钟前
Ilya震撼发声!OpenAI前主管亲证:AGI已觉醒,人类还在装睡
人工智能·openai
胡耀超30 分钟前
数据安全工具手册——便捷实用的安全工具集-20251014
python·安全·数据安全·加密·数据库安全·脱敏·开源工具
朱昆鹏37 分钟前
如何通过sessionKey 登录 Claude
前端·javascript·人工智能
汉堡go43 分钟前
1、机器学习与深度学习
人工智能·深度学习·机器学习
shx66661 小时前
python杂记
开发语言·python
只是懒得想了1 小时前
使用 Gensim 进行主题建模(LDA)与词向量训练(Word2Vec)的完整指南
人工智能·自然语言处理·nlp·word2vec·gensim