ipdb> outputs.size()
torch.Size([10, 100])
ipdb> print sum(outputs,0).size(),sum(outputs,1).size(),sum(outputs,2).size()
(100L,) (100L,) (100L,)
Как я могу суммировать по столбцам?
ipdb> outputs.size()
torch.Size([10, 100])
ipdb> print sum(outputs,0).size(),sum(outputs,1).size(),sum(outputs,2).size()
(100L,) (100L,) (100L,)
Как я могу суммировать по столбцам?
Самое простое и лучшее решение - использовать torch.sum()
.
Суммировать все элементы тензора:
torch.sum(outputs) # gives back a scalar
Суммировать по всем строкам (т.е. Для каждого столбца):
torch.sum(outputs, dim=0) # size = [1, ncol]
Суммирование по всем столбцам (т.е. Для каждой строки):
torch.sum(outputs, dim=1) # size = [nrow, 1]
В качестве альтернативы вы можете использовать tensor.sum(axis)
где axis
показывает 0
и 1
для суммирования по строкам и столбцам соответственно, для 2D-тензора.
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])
Как видно из приведенных выше выходов, в обоих случаях выход представляет собой одномерный тензор. Если, с другой стороны, вы также хотите сохранить размер исходного тензора в выходных данных, тогда вы установили для логического значения kwarg keepdim
значение True
как в:
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]])
Если у вас есть тензор 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])
, где каждая запись является суммой по всем строкам в данном столбце outputs
тензора.
Для иллюстрации с трехмерным тензором:
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]])