Thêm một tensor chỉ mục đã chọn vào tensor khác với các chỉ số chồng chéo trong pytorch

Jan 06 2021

Đây là một câu hỏi tiếp theo cho câu hỏi này . Tôi muốn làm điều tương tự trong pytorch. có khả năng làm cái này không? Nếu có, làm thế nào?

import torch
image = torch.tensor([[246,  50, 101], [116,   1, 113], [187, 110,  64]])
iy = torch.tensor([[1, 0, 2], [1, 0, 2], [2, 2, 2]])
ix = torch.tensor([[0, 2, 1], [1, 2, 0], [0, 1, 2]])
warped_image = torch.zeros(size=image.shape)

Tôi cần một cái gì đó tương tự như torch.add.at(warped_image, (iy, ix), image)vậy cho kết quả đầu ra là

[[  0.   0.  51.]
 [246. 116.   0.]
 [300. 211.  64.]]

Lưu ý rằng các chỉ số tại (0,1)(1,1)trỏ đến cùng một vị trí (0,2). Vì vậy, tôi muốn warped_image[0,2] = image[0,1] + image[1,1] = 51.

Trả lời

3 Ivan Jan 06 2021 at 01:23

Những gì bạn đang tìm kiếm là torch.Tensor.index_put_với accumulateđối số được đặt thành True:

>>> warped_image = torch.zeros_like(image)

>>> warped_image.index_put_((iy, ix), image, accumulate=True)
tensor([[  0,   0,  51],
        [246, 116,   0],
        [300, 211,  64]])

Hoặc, bằng cách sử dụng phiên bản out-place torch.index_put:

>>> torch.index_put(torch.zeros_like(image), (iy, ix), image, accumulate=True)
tensor([[  0,   0,  51],
        [246, 116,   0],
        [300, 211,  64]])