Скажем, у меня есть tensor
A
, а индексы Tensor
: A = [1, 2, 3, 4]
, indexes = [1, 0, 3, 2]
Я хочу создать новый Tensor
из этих двух со следующим результатом: [2, 1, 4, 3]
Каждый элемент результата является элементом из A
, а порядок определяется индексами Tensor
.
Есть ли способ сделать это с помощью PyTorch tensor
ops без циклов?
Моя цель — сделать это для 2D Tensor
, но я не думаю, что есть способ сделать это без циклов, поэтому я подумал спроецировать это на 1D, выполнить работу и спроецировать обратно на 2D.
В 1D можно просто выполнить A[indexes]
.
В 2D это все еще выполнимо следующим образом:
A = torch.arange(5, 10).repeat(3, 1) # shape: (3, 5)
indexes = torch.stack([torch.randperm(5) for _ in range(3)]) # shape (3, 5)
A_sort = A[torch.arange(3).unsqueeze(1), indexes]
print(A_sort)
Была ошибка, теперь должно работать.
Вы можете использовать разбрасывать:
A = torch.tensor([1, 2, 3, 4])
indices = torch.tensor([1, 0, 3, 2])
result = torch.tensor([0, 0, 0, 0])
print(result.scatter_(0, indices, A))
Привет. Это то, что я искал. Спасибо. Что касается 2D-решения, я получаю сообщение об ошибке, возможно, вы имели в виду: A_sort = A[диапазон (5) [0], индексы]?