Masking tensor of same shape in PyTorch

Given an array and mask of same shapes, I want the masked output of the same shape and containing 0 where mask is False.

For example,

# input array img = torch.randn(2, 2) print(img) # tensor([[0.4684, 0.8316], # [0.8635, 0.4228]]) print(img.shape) # torch.Size([2, 2]) # mask mask = torch.BoolTensor(2, 2) print(mask) # tensor([[False, True], # [ True, True]]) print(mask.shape) # torch.Size([2, 2]) # expected masked output of shape 2x2 # tensor([[0, 0.8316], # [0.8635, 0.4228]]) 

Issue: The masking changes the shape of the output as follows:

#1: shape changed img[mask] # tensor([0.8316, 0.8635, 0.4228]) 

3 Answers

Simply type-cast your boolean mask to an integer mask, followed by float to bring the mask to the same type as in img. Perform element-wise multiplication afterwards.

masked_output = img * mask.int().float()

One of the ways I found to solve it was:

img[mask==False] = 0 

or using

img[~mask] = 0 

It'll change the img itself.

0

The most straight forward way would be creating another tensor to handle it.

import torch def generate_masked_tensor(input, mask, fill=0): masked_tensor = torch.zeros(input.size()) + fill masked_tensor[mask] = input[mask] return masked_tensor if __name__ == "__main__": img = torch.randn(2, 2) mask = torch.tensor([False, True, True, False]).bool().view(2, 2) masked_img = generate_masked_tensor(img, mask) print (masked_img) 

The output:

tensor([[0.0000, 0.8028], [1.5411, 0.0000]]) 
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like