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

相关推荐
华如锦4 分钟前
面了很多 Java转AI Agent方向,一些面试题总结
java·开发语言·人工智能·python·ai
微学AI5 分钟前
大模型与量子纠缠:一场关于“关联“的范式对话与深度研究
人工智能·量子纠缠
虹科网络安全8 分钟前
艾体宝产品|Arango AutoGraph 如何重构企业的知识图谱
人工智能·重构·知识图谱
戴西软件23 分钟前
戴西 DLM 许可授权管理系统:破解无网络环境下工业软件授权难题,助力制造企业降本增效
网络·人工智能·python·深度学习·程序人生·算法·制造
前端不太难23 分钟前
从GPU到AI工厂:智能时代的基础设施革命
人工智能·gpu算力
AI焦点28 分钟前
跨越协议鸿沟:Tool Use状态机从Anthropic到OpenAI兼容体系的适配要点
前端·人工智能
Dxy123931021632 分钟前
Python线程锁:为什么多线程会“打架“,以及怎么解决
开发语言·前端·python
Black蜡笔小新35 分钟前
制造业AI质检工作站/企业AI算力工作站DLTM助力制造业质检智能化升级
人工智能·深度学习·机器学习
提示词牛马36 分钟前
2026年人工智能(AI)现状分析报告
人工智能