如何根据相同大小的索引张量重新排序张量

How to reorder tensor based on indexes tensor from the same size

假设我有 tensor A,索引 TensorA = [1, 2, 3, 4]indexes = [1, 0, 3, 2]

我想用这两个创建一个新的 Tensor,结果如下:[2, 1, 4, 3] 结果的每个元素都是来自 A 的元素,顺序由索引 Tensor 定义。 有没有办法用 PyTorch tensor ops 没有循环来做到这一点?

我的目标是为 2D 做 Tensor,但我不认为没有循环就可以做到,所以我想将它投影到 1D,做工作并投影它回到二维

在 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)

您可以使用 scatter:

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))