Разбросать однородный список значений до тензора PyTorch - PullRequest
0 голосов
/ 01 марта 2019

Рассмотрим следующий список:

[[3], [1, 2], [4], [0], [2]]

И тензор нулей размера (5, 5)

Я хочу заполнить эти индексы в соответствии с их индексом в списке до тензора с 1.

Итак, ожидаемый результат должен быть:

tensor([[0., 0., 0., 1., 0.],
        [0., 1., 1., 0., 0.],
        [0., 0., 0., 0., 1.],
        [1., 0., 0., 0., 0.],
        [0., 0., 1., 0., 0.]])

То, что произошло выше, это:

по индексу [0, 3] положить 1 (случай дляпервый элемент в моем списке).


Очень похожий случай возможен при использовании Tensor.scatter_.Однако, поскольку он принимает тензор в качестве аргумента (index);Вы не можете создать тензор из списка, если он содержит подсписок, размер которого отличается от других элементов, как в случае с [1, 2] в моем списке (на самом деле это проблема) .

Можно использовать метод scatter, если список имеет все такие же размеры, как показано ниже:

tensor.scatter_(1, torch.tensor(index), 1)

Допустимы Numpy решения

1 Ответ

0 голосов
/ 01 марта 2019

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

max_length = max([len(l) for l in index])
index = [l + l[-1:] * (max_length - len(l)) for l in index]

Этот код будет повторять последний элемент каждого подсписка, пока все они не будут одинаковымиразмер.Затем вы можете передать его в функцию scatter_, как написали в своем вопросе.

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