Python 沿轴的张量之和

Python 沿轴的张量之和,python,sum,pytorch,torch,tensor,Python,Sum,Pytorch,Torch,Tensor,如何对列求和?最简单、最好的解决方案是使用torch.sum() 要对张量的所有元素求和: ipdb> outputs.size() torch.Size([10, 100]) ipdb> print sum(outputs,0).size(),sum(outputs,1).size(),sum(outputs,2).size() (100L,) (100L,) (100L,) 对所有行(即每列)求和: 要对所有列(即每行)求和: 或者,您可以使用tensor.sum(axis),

如何对列求和?

最简单、最好的解决方案是使用
torch.sum()

要对张量的所有元素求和:

ipdb> outputs.size()
torch.Size([10, 100])
ipdb> print sum(outputs,0).size(),sum(outputs,1).size(),sum(outputs,2).size()
(100L,) (100L,) (100L,)
对所有行(即每列)求和:

要对所有列(即每行)求和:


或者,您可以使用
tensor.sum(axis)
,其中
axis
表示
0
1
分别对二维张量的行和列求和

torch.sum(outputs, dim=1) # size = [nrow, 1]
从上面的输出可以看出,在这两种情况下,输出都是一维张量。另一方面,如果您希望在输出中也保留原始张量的维数,那么您已经将布尔值kwarg
keepdim
设置为
True
,如下所示:

In [210]: X
Out[210]: 
tensor([[  1,  -3,   0,  10],
        [  9,   3,   2,  10],
        [  0,   3, -12,  32]])

In [211]: X.sum(1)
Out[211]: tensor([ 8, 24, 23])

In [212]: X.sum(0)
Out[212]: tensor([ 10,   3, -10,  52])

如果您有张量
my_tensor
,并且希望在第二个数组维度上求和(即,索引为1的数组维度,如果张量是二维的,则为列维度,与您的一样),请使用
torch.sum(my_tensor,1)
或等效
my_tensor.sum(1)
请参阅

文档中没有明确提到的一件事是:您可以使用
-1
(或倒数第二个维度,使用
-2
等)对最后一个数组维度进行求和

因此,在您的示例中,您可以使用:
outputs.sum(1)
torch.sum(outputs,1)
,或者,等效地,
outputs.sum(-1)
torch.sum(outputs,-1)
。所有这些都将给出相同的结果,一个大小为
torch.size([10])
的输出张量,每个条目都是张量
输出的给定列中所有行的总和

用三维张量来说明:

In [217]: X.sum(0, keepdim=True)
Out[217]: tensor([[ 10,   3, -10,  52]])

In [218]: X.sum(1, keepdim=True)
Out[218]: 
tensor([[ 8],
        [24],
        [23]])

谢谢,这是一个很好的答案。这个dim-var乍一看似乎非常违反直觉,关于合成张量的维数的一个很好的观察结果是,无论我们提供哪个dim为1,最终张量在该特定轴上都有1,保持其余轴的维数不变。这特别有助于我想象在高维张量的情况下如何求和。
In [210]: X
Out[210]: 
tensor([[  1,  -3,   0,  10],
        [  9,   3,   2,  10],
        [  0,   3, -12,  32]])

In [211]: X.sum(1)
Out[211]: tensor([ 8, 24, 23])

In [212]: X.sum(0)
Out[212]: tensor([ 10,   3, -10,  52])
In [217]: X.sum(0, keepdim=True)
Out[217]: tensor([[ 10,   3, -10,  52]])

In [218]: X.sum(1, keepdim=True)
Out[218]: 
tensor([[ 8],
        [24],
        [23]])
In [1]: my_tensor = torch.arange(24).view(2, 3, 4) 
Out[1]: 
tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]])

In [2]: my_tensor.sum(2)
Out[2]:
tensor([[ 6, 22, 38],
        [54, 70, 86]])

In [3]: my_tensor.sum(-1)
Out[3]:
tensor([[ 6, 22, 38],
        [54, 70, 86]])