torch.stack([t1,t1,t1],dim=1) 和 torch.hstack([t1,t1,t1]) 有什么区别?

问题描述 投票:0回答:2

从技术上讲,torch.stack([t1,t1,t1],dim=1) 和 torch.hstack([t1,t1,t1]) 方法执行相同的操作,即它们都水平堆叠向量。 但是当我在同一个向量上执行这两个操作但它们产生 2 个不同的输出时,有人可以解释为什么吗?

获取张量 t1 :

# Code : 
t1 = torch.arange(1.,10.)
t1,t1.shape
# Output : 
(tensor([1., 2., 3., 4., 5., 6., 7., 8., 9.]), torch.Size([9]))

使用 torch.stack([t1,t1,t1],dim=1)

# Code :
t1_stack = torch.stack([t1,t1,t1],dim=1)
#  dim value lies between [-2,1]
# -2 and 0 stack vertically
# -1 and 1 stack Horizontally
t1_stack,t1_stack.shape
# Output :
(tensor([[5., 5., 5.],
         [2., 2., 2.],
         [3., 3., 3.],
         [4., 4., 4.],
         [5., 5., 5.],
         [6., 6., 6.],
         [7., 7., 7.],
         [8., 8., 8.],
         [9., 9., 9.]]),
 torch.Size([9, 3]))

使用 torch.hstack([t1,t1,t1])

# Code : 
h_stack = torch.hstack([t1,t1,t1])
h_stack,h_stack.shape
# Output : 
(tensor([5., 2., 3., 4., 5., 6., 7., 8., 9., 5., 2., 3., 4., 5., 6., 7., 8., 9.,
         5., 2., 3., 4., 5., 6., 7., 8., 9.]),
 torch.Size([27]))

它为同一向量提供 2 个不同的输出,同时使用不同的方法进行水平堆叠

python-3.x vector pytorch stacking-context
2个回答
2
投票

查看 pytorch 文档:

  • hstack:“这相当于一维张量沿第一个轴的串联”。
  • stack:“沿着新维度连接一系列张量。”
很明显,这与您的情况(一维张量)中的操作不完全相同。


0
投票
你可以看一下

关于hstack使用的官方文档,它说“水平排列张量(按列)。这相当于一维张量沿第一个轴串联,沿第二个轴串联对于所有其他张量。” 在您的示例中,使用 hstack 后,新张量的形状与原始张量具有相同的维度。而使用堆栈后,您的新张量将多一维形状。

看例子会更清楚。

a = torch.tensor([[1],[2],[3]]) b = torch.tensor([[4],[5],[6]]) hstack_ab = torch.hstack((a,b)) stack_ab = torch.stack((a,b), dim=1) print(hstack_ab) print(stack_ab) print(a.shape, b.shape) print(hstack_ab.shape, stack_ab.shape)
然后你会得到如下结果:

tensor([[1, 4], [2, 5], [3, 6]]) tensor([[[1], [4]], [[2], [5]], [[3], [6]]]) torch.Size([3, 1]) torch.Size([3, 1]) torch.Size([3, 2]) torch.Size([3, 2, 1])
    
© www.soinside.com 2019 - 2024. All rights reserved.