Как добавить в тензор pytorch по индексам? - PullRequest
0 голосов
/ 19 сентября 2019

Признаюсь, меня немного смущают операции разброса * и индекса * - я не уверен, что кто-то из них делает именно то, что мне нужно, что очень просто:

Учитывая некоторый двумерный тензор

z = tensor([[1., 1., 1., 1.],
            [1., 1., 1., 1.],
            [1., 1., 1., 1.]])

И список (или тензор?) Двумерных индексов:

inds = tensor([[0, 0],
               [1, 1],
               [1, 2]])

Я хочу добавить к этим скалярам скаляр(и сделайте это эффективно):

znew = z.something_add(inds, 3)
->
znew = tensor([[4., 1., 1., 1.],
               [1., 4., 4., 1.],
               [1., 1., 1., 1.]])

Если мне нужно, я могу сделать этот скаляр тензором любой формы (где все элементы = 3), но я бы предпочел не ...

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Этот код достигает того, что вы хотите:

z_new = z.clone() # copy the tensor
z_new[inds[:, 0], inds[:, 1]] += 3 # modify selected indices of new tensor

В PyTorch вы можете индексировать каждую ось тензора другим тензором.

1 голос
/ 19 сентября 2019

Вы должны предоставить два списка для индексации.Первый имеет позиции строки, а второй позиции столбца.В вашем примере это будет:

z[[0, 1, 1], [0, 1, 2]] += 3

torch.Tensor indexing следует за Numpy.Подробнее см. https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#integer-array-indexing.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...