如何为张量在双维度填充零?PyTorch实现遇阻求助
解决张量特定位置零填充的问题
你的问题核心是要在原始张量的特定位置插入零,而stack/cat失败是因为你没有让待拼接的张量保持一致的形状和维度。下面给你两种简单可行的实现方法:
方法一:直接构造目标张量并赋值(最直观)
这种思路是先创建一个符合目标长度的全零张量,然后把原始张量的元素放到对应的位置上,非常适合这种位置规律明确的场景。
import torch # 修正初始张量(匹配你说的1-8初始元素) t = torch.arange(1, 9).float() # tensor([1., 2., 3., 4., 5., 6., 7., 8.]) # 构造目标全零张量,长度和你想要的结果一致(24个元素) target = torch.zeros(24) # 定义原始元素在目标张量中的位置索引 # 规律:前5个零,之后每两个元素占4位(元素+两个零),最后一组元素后接5个零 indices = torch.tensor([5,6,9,10,13,14,17,18]) # 将原始元素赋值到目标位置 target[indices] = t print(target) # 输出:tensor([0., 0., 0., 0., 0., 1., 2., 0., 0., 3., 4., 0., 0., 5., 6., 0., 0., 7., 8., 0., 0., 0., 0., 0.])
方法二:通过拼接小张量实现
如果你更倾向于用拼接的方式,可以把原始张量拆分成小块,然后和零张量交替拼接,最后再加上前后的零:
import torch t = torch.arange(1, 9).float().reshape(4, 2) # 拆成4个(2,)的块:[[1,2],[3,4],[5,6],[7,8]] # 定义每个块后面要加的零张量(两个零) zero_pad = torch.zeros(2) # 对前3个块,每个块拼接两个零;最后一个块直接保留 blocks_with_pad = [torch.cat([block, zero_pad]) for block in t[:3]] + [t[3]] # 把所有块拼接起来,再前后分别加上5个零 middle_part = torch.cat(blocks_with_pad) target = torch.cat([torch.zeros(5), middle_part, torch.zeros(5)]) print(target) # 输出和方法一完全一致
为什么你的stack/cat失败?
torch.stack是在新的维度上拼接张量,要求所有输入张量的形状完全相同,你之前的张量维度/形状不匹配,所以报错。torch.cat是在已有维度上拼接,要求除了拼接维度外的其他维度完全一致。如果你想用cat,需要确保待拼接的张量在非拼接维度上的形状完全对齐,但显然你之前的零张量形状没有和原始张量的分块对应上。
内容的提问来源于stack exchange,提问作者Dex
相关产品推荐
相关产品推荐

