torch.stack(dim=1)与torch.hstack对一维张量操作的差异疑问
为什么torch.stack与torch.hstack对一维张量水平堆叠结果不同?
先明确实验基础:
定义一维张量t1:
t1 = torch.arange(1.,10.) # 输出:(tensor([1., 2., 3., 4., 5., 6., 7., 8., 9.]), torch.Size([9]))
1. torch.stack的本质:新增维度后堆叠
torch.stack([t1,t1,t1], dim=1)的核心逻辑是先给每个输入张量新增一个维度,再在指定维度上拼接:
- 原
t1是1维(shape[9]),stack操作会先把每个t1扩展为2维(shape[9,1]) - 然后在
dim=1这个新增维度上拼接三个[9,1]的张量,最终得到shape[9,3]的2维张量 - 表现为原张量的每个元素对应一行,三个
t1的相同位置元素组成列:
tensor([[1., 1., 1.], [2., 2., 2.], [3., 3., 3.], [4., 4., 4.], [5., 5., 5.], [6., 6., 6.], [7., 7., 7.], [8., 8., 8.], [9., 9., 9.]])
2. torch.hstack的本质:在已有维度上直接拼接
torch.hstack([t1,t1,t1])的核心是在水平方向(最后一个维度)直接拼接已有维度,不会新增维度:
- 对于1维张量,水平拼接就是把三个长度为9的张量首尾相接,最终得到长度为
9*3=27的1维张量 - 表现为三个
t1的元素依次连续排列:
tensor([1., 2., 3., 4., 5., 6., 7., 8., 9., 1., 2., 3., 4., 5., 6., 7., 8., 9., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
核心区别总结
torch.stack:要求所有输入张量形状完全相同,操作后增加一个维度,把多个同形状张量组合成更高维结构torch.hstack:要求除拼接维度外其他维度形状一致,操作后维度数不变,仅对应维度的长度增加
内容的提问来源于stack exchange,提问作者Hemanthsai
相关产品推荐
相关产品推荐

