Смотрите разницу между двумя индексами:
In []: t[0, 0].shape
Out[]: torch.Size([])
In []: t[[0], [0]].shape
Out[]: torch.Size([1])
Когда вы непосредственно индексируете (0, 0)
-й элемент t
, у вас есть ссылка на эту запись, и вы можете вставить add_
в нее. Форма t[0,0]
- []
- то есть вы получаете скаляр обратно - содержимое записи (0,0)
.
Однако, когда вы используете списочные индексы ([0], [0])
, вы получаете 1-мерный тензор, форма которого равна [1]
. То есть вы получаете копию субтензора t
. Затем вы помещаете add_
в эту копию суб-тензора, вы не оказываете влияния на оригинал t
:
In []: r = t[[0], [0]].add_(10)
In []: t
Out[]:
tensor([[0, 1],
[1, 0]])
In []: r
Out[]: tensor([10])
Возможно, вы хотите заглянуть в index_add_()
, чтобы выполнить свою задачу.
Обновление
Когда вы присваиваете t
с помощью индексов списка, вы не создаете копию (это не имеет смысла. Итак,
t[[0], [0]] += 10
переводится как
t[[0], [0]] = t[[0], [0]] + 10
То есть, с правой стороны у нас есть копия субтензора (0,0)
t
, и мы добавляем 10 к этому субтензору, в результате чего получается форма [1]
тензор со значением [10]
. С левой стороны мы присваиваем [10]
субтензору (0,0)
t
(не его копии - это не имеет смысла).
Поэтому на выходе t[[0], [0]] += 10
будет
tensor([[10, 1],
[ 1, 0]])