PyTorch:tensor-张量维度操作(拼接、维度扩展、压缩、转置、重复……)
1. 张量基础与维度操作概览在PyTorch中张量Tensor是多维数组的核心数据结构类似于NumPy的ndarray但具备GPU加速和自动求导功能。理解张量维度操作是深度学习模型开发的基础技能就像厨师需要掌握切菜技巧一样重要。张量维度操作主要分为以下几类拼接操作将多个张量合并为一个如torch.cat和torch.stack维度调整改变张量的形状和维度如view、reshape、permute扩展压缩增加或减少维度如unsqueeze和squeeze重复复制沿特定维度复制数据如repeat和expand我刚开始学习时经常混淆stack和cat的区别直到在图像分类任务中处理批次数据时才真正理解cat是在现有维度上拼接而stack会创建新维度。比如处理5张224x224的RGB图片时# 使用stack会得到[5,3,224,224]的四维张量 # 使用cat(dim0)会得到[15,224,224]的三维张量通常不是我们想要的2. 张量拼接torch.cat与torch.stack详解2.1 torch.cat沿现有维度拼接torch.cat是最常用的拼接方法它不会创建新维度而是在现有维度上连接张量。就像把多个书架上的书合并到一个更长的书架上。import torch # 创建两个形状相同的张量 a torch.randn(2, 3) # 2行3列 b torch.randn(2, 3) # 沿第0维行方向拼接 c torch.cat([a, b], dim0) # 结果形状[4,3] # 沿第1维列方向拼接 d torch.cat([a, b], dim1) # 结果形状[2,6]实际应用场景在自然语言处理中处理变长序列时常用cat拼接不同长度的句子配合padding mask使用。2.2 torch.stack创建新维度拼接torch.stack会在新创建的维度上拼接张量要求所有输入张量形状完全相同。就像把多张照片放入相册形成一个新的照片索引维度。# 继续使用前面的a和b张量 e torch.stack([a, b], dim0) # 形状[2,2,3] f torch.stack([a, b], dim1) # 形状[2,2,3] g torch.stack([a, b], dim2) # 形状[2,3,2]关键区别stack输入张量列表cat输入张量序列stack会新增维度cat不会stack要求所有张量形状相同cat只需在拼接维度外其他维度相同我在处理3D医学图像时常用stack将多个2D切片组合成3D体积数据slice_list [torch.randn(256,256) for _ in range(100)] volume torch.stack(slice_list, dim0) # [100,256,256]3. 维度扩展与压缩3.1 unsqueeze增加维度torch.unsqueeze在指定位置插入长度为1的维度就像给向量加一个括号使其成为矩阵x torch.tensor([1,2,3]) # 形状[3] y x.unsqueeze(0) # 形状[1,3]相当于[[1,2,3]] z x.unsqueeze(1) # 形状[3,1]相当于[[1],[2],[3]]等价操作y x[None,:] # 同unsqueeze(0) z x[:,None] # 同unsqueeze(1)3.2 squeeze压缩维度torch.squeeze移除长度为1的维度默认移除所有也可指定维度a torch.randn(1,3,1,2) b a.squeeze() # 形状[3,2] c a.squeeze(0) # 形状[3,1,2] d a.squeeze(2) # 形状[1,3,2]注意如果指定压缩的维度长度不为1则不会发生任何变化。3.3 expand内存高效的维度扩展expand不会实际复制数据而是通过广播机制实现维度扩展x torch.tensor([[1],[2],[3]]) # [3,1] y x.expand(3,4) # [3,4] 结果 [[1,1,1,1], [2,2,2,2], [3,3,3,3]] 使用限制只能将长度为1的维度扩展到更大尺寸-1表示保持该维度不变原始张量在非扩展维度上必须与新尺寸匹配4. 张量变形与转置操作4.1 view与reshape改变张量形状view和reshape都能改变张量形状而不改变数据x torch.randn(4,4) y x.view(16) # 展平 z x.view(-1,8) # -1表示自动计算该维度大小 w x.reshape(2,8) # 功能类似view重要区别view要求张量内存连续否则会报错reshape会自动处理非连续张量但可能产生拷贝在模型训练中建议先用contiguous()确保连续性再用view4.2 转置操作t、transpose和permute对于矩阵转置2D张量x torch.randn(3,4) y x.t() # [4,3] z x.T # 同t()高维张量转置x torch.randn(2,3,4) y x.transpose(0,1) # [3,2,4] z x.permute(2,0,1) # [4,2,3]permute比transpose更灵活可以一次性重新排列所有维度顺序。5. 张量复制与重复5.1 repeat数据复制的维度扩展repeat会实际复制数据沿各维度重复指定次数x torch.tensor([1,2,3]) y x.repeat(2,3) # [2,9] [[1,2,3,1,2,3,1,2,3], [1,2,3,1,2,3,1,2,3]] 5.2 expand与repeat的选择expand适用于广播场景不实际增加内存占用repeat适用于需要独立副本的场景会增加内存修改expand结果会影响原始张量repeat则不会6. 高级维度操作技巧6.1 gather与scatter索引操作gather按照索引从输入张量收集数据x torch.tensor([[1,2],[3,4]]) index torch.tensor([[0,0],[1,0]]) y x.gather(1, index) # 沿dim1收集 [[1,1], [4,3]] scatter是gather的逆操作将值分散到指定位置z torch.zeros(2,2) z.scatter_(1, index, x) # 将x的值按index分散到z6.2 内存共享机制许多张量操作如view、transpose、narrow会共享底层存储修改一个会影响另一个x torch.randn(3,4) y x.view(4,3) y[0,0] 100 # x也会被修改要避免这种情况可以使用clone()创建独立副本z x.clone().view(4,3) # 不共享内存7. 实际应用场景示例7.1 图像数据处理处理批次图像时常用维度操作# 单张图像 [C,H,W] - 批次 [B,C,H,W] img torch.randn(3,224,224) batch img.unsqueeze(0).expand(32,-1,-1,-1) # 特征图拼接 feat1 torch.randn(32,64,56,56) feat2 torch.randn(32,128,56,56) combined torch.cat([feat1,feat2], dim1) # [32,192,56,56]7.2 自然语言处理在Transformer模型中# 多头注意力机制中的维度变换 q torch.randn(32,10,64) # [batch, seq_len, dim] k q.view(32,10,8,8).transpose(1,2) # [32,8,10,8]7.3 模型权重初始化初始化线性层权重时weight torch.empty(3,4) nn.init.kaiming_normal_(weight) # 添加batch维度 weight weight.unsqueeze(0).expand(32,-1,-1) # [32,3,4]8. 常见错误与调试技巧维度不匹配错误# 错误示例 a torch.randn(2,3) b torch.randn(2,4) torch.cat([a,b], dim1) # 报错除dim1外其他维度必须相同非连续内存错误x torch.randn(3,4).transpose(0,1) y x.view(12) # 报错张量不连续 # 修复方案 y x.contiguous().view(12)广播机制误解a torch.randn(3,1) b torch.randn(1,3) c a b # 正确[3,3] d a.expand(3,4) # 正确 e a.expand(4,3) # 报错无法将3扩展到4调试建议经常检查张量shapeprint(tensor.shape)使用assert确保维度符合预期对复杂操作分步验证

相关新闻

Unity模块化开发:asmdef实战指南与性能优化

Unity模块化开发:asmdef实战指南与性能优化

1. 初识asmdef:Unity模块化开发的钥匙第一次在Unity项目中看到asmdef文件时,我正被一个200万行代码的巨型项目折磨得焦头烂额。每次修改脚本都要等待长达3分钟的编译时间,团队成员的日常对话经常是"你编译完了吗?轮到我了&qu…

2026/7/4 1:43:00阅读更多 →
Unity InputSystem实战:InputAction高效输入管理技巧

Unity InputSystem实战:InputAction高效输入管理技巧

1. 为什么InputAction值得你花时间?作为一个在Unity项目里摸爬滚打多年的老司机,我见过太多团队在输入管理上栽跟头。传统的Input Manager就像个老旧的工具箱——能用但杂乱无章。直到Unity推出了Input System这套新工具,特别是其中的InputAc…

2026/7/4 1:38:00阅读更多 →
让姑姑不再划拳 码农也要有原则 : SOLID via C#

让姑姑不再划拳 码农也要有原则 : SOLID via C#

何为SOLID? S.O.L.I.D.是一组面对面向对象设计的最佳实践的设计原则。术语来自Robert C.Martin的著作Agile Principles, Patterns, and Practices in C#,代表了下面五个设计原则: 1. SRP(Single Responsibility Principle) 单一责任原则, 2.…

2026/7/4 1:38:00阅读更多 →
JMeter分布式压测实战:突破单机瓶颈,模拟海量并发

JMeter分布式压测实战:突破单机瓶颈,模拟海量并发

1. 项目概述:为什么我们需要分布式压测? 做性能测试的朋友,尤其是用JMeter的,肯定都遇到过这个瓶颈:单台机器发起的并发量,怎么都上不去。你可能会发现,当你在自己的笔记本或者一台普通的服务器…

2026/7/4 3:38:10阅读更多 →
不用喂食不用换水的“水族箱”、逆向净水器的智能水龙头,接入 Home Assistant、用 RF 破解把吊扇接入智能家居|DF创客周刊(第178期)

不用喂食不用换水的“水族箱”、逆向净水器的智能水龙头,接入 Home Assistant、用 RF 破解把吊扇接入智能家居|DF创客周刊(第178期)

社区公众号记录每周值得分享的创客相关内容,每周五发布~ 欢迎投稿或推荐相关内容。 投稿邮箱:MakerCommunityoutlook.com 机器鱼水族箱:不用喂食不用换水! 养鱼好看但伺候起来一点也不轻松——换水、控温、定时喂食、出…

2026/7/4 3:38:10阅读更多 →
Windows安全中心保护历史记录清理:从手动删除到策略配置的完整指南

Windows安全中心保护历史记录清理:从手动删除到策略配置的完整指南

1. 为什么需要清理Windows安全中心保护历史记录Windows安全中心作为系统内置的安全防护组件,会持续记录所有防护事件。这些记录包括病毒扫描结果、威胁处理过程、隔离文件信息等。随着时间推移,这些历史记录会不断累积,最终可能导致两个典型问…

2026/7/4 3:38:10阅读更多 →
为什么科研 RAG 不能只靠 OpenAlex 和通用搜索:Sciverse 的证据层思路

为什么科研 RAG 不能只靠 OpenAlex 和通用搜索:Sciverse 的证据层思路

导语 2026 年 7 月 1 日,Anthropic 推出面向科研与药企场景的 Claude Science,再次把“科研 Agent”推到台前。但工作台热度越高,一个问题越清楚:如果上游只有 metadata API、DOI API 和通用搜索,Agent 依然很难稳定拿…

2026/7/4 3:38:10阅读更多 →
Docker集群及docker-compsoe

Docker集群及docker-compsoe

一、问题引入 在我们日常学习或开发过程中,如果我们的服务均采用docker容器的方式运行,比如提供后端接口服务的容器containerA和提供数据存取服务的容器containerB,如下图所示,不同的docker 容器拥有各自的ip地址和端口号。 1. 多…

2026/7/4 3:38:10阅读更多 →
力扣-高频 SQL 50 题(基础版)-1280. 学生们参加各科测试的次数

力扣-高频 SQL 50 题(基础版)-1280. 学生们参加各科测试的次数

一、完整建表 SQL(MySQL 语法):二、 需求:查询出每个学生参加每一门科目测试的次数,结果按 student_id 和 subject_name 排序三、 思路:1.插入数据构造表格2.写题表层视觉迷惑点下面这会是大部分人第一次的…

2026/7/4 3:33:10阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/3 14:18:39阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/3 14:38:35阅读更多 →
端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

1. 项目概述:当算法工程师走进GTC26展厅,看到的不是芯片,而是“端到端”的呼吸节奏“端到端”这三个字,在GTC’26现场出现的频率,高得像NVLink带宽测试时的峰值曲线——它不再是一个论文里的技术路径选项,而…

2026/7/4 0:02:48阅读更多 →
缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考牙齿缺失是中老年人群中较为常见的口腔问题,不仅会造成咀嚼不便、进食受影响,长期还可能对营养摄入与日常社交带来困扰。义齿是改善缺牙问题的常用方式,目前市面上的义齿种类较多,…

2026/7/4 0:02:48阅读更多 →
STM32F091RC与LTC6904实现高精度方波信号生成

STM32F091RC与LTC6904实现高精度方波信号生成

1. 项目概述:LTC6904与STM32F091RC的精准方波生成方案在嵌入式系统开发中,精确的时钟信号和定时控制往往是项目成败的关键。LTC6904作为一款低功耗、高精度的可编程振荡器芯片,与STM32F091RC这款ARM Cortex-M0内核微控制器的组合,…

2026/7/4 0:02:48阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/4 1:16:56阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/4 2:33:55阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/4 2:33:55阅读更多 →