How to replace the value of multiple cells in multiple rows in a Pytorch tensor?

I have a tensor

import torch
torch.zeros((5,10))

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

How can I replace the values of X random cells in each row with random inputs (torch.rand())?

That is, if X = 2, in each row, 2 random cells should be replaced with torch.rand(). Since I need it to not break backpropagation I found here that replacing the .data attribute of the cells should work.

The only familiar thing to me is using a for loop but it's not efficient for a large tensor


You can try tensor.scatter_().

x = torch.zeros(3,4)
n_replace = 3 # number of cells to be replaced with random number
src = torch.randn(x.size())
index = torch.stack([torch.randperm(x.size()[1]) for _ in range(x.size()[0])])[:,:n_replace]

x.scatter_(1, index, src)
Out[22]: 
tensor([[ 0.0000,  0.5769,  0.7432, -0.1776],
        [-2.1673, -1.0802,  0.0000,  0.6241],
        [-0.6421,  0.1315,  0.0000, -2.7224]])

To avoid repetition,

perm = torch.randperm(tensor.size(0))
idx = perm[:k]
samples = tensor[idx]