Reshape Tensors to discard all empty slots

lets say i make a tensor

tensor = torch.empty(10,10)

And then lets say i have some logic that fills out 8x8 of that empty space with values.

tensor[0:8,0:8] = 2

is there an easy way to reshape such a tensor into a 8x8 tensor removing all the remaining empty slots.?

And you are not aware of the dimensions of the subspace that has been filled so 8x8 is unknown to you

tensor[0:8,0:8] 

is not a solution

You could try to do it via binary masking and indexing like this:

new_tensor = tensor[tensor!=0]

Edit: you would have to create a tensor of zeros, as you don’t have any control over the content of an empty tensor.

problem is 0 is also a valid value that will be put into the subspace.

it is nifti input. So every value from -1000 to 30000 is valid values.

You would have to pick a value, which is not in your input space. Something like this:

ARBITRARY_VAL = -20000

tensor = torch.ones(10,10) * ARBITRARY_VAL 
tensor[0:8, 0:8] = 2
new_tensor = tensor[tensor!=ARBITRARY_VAL]

Instead of != you could also use other logical operators like >= (depending on your arbitrary value).

tensor = torch.ones(10,10)
tensor[0:8,0:8] = 2
print(tensor[tensor!=1].shape)

will return a 1x64 tensor

Strange, but true.
And you cannot access any of the dimensions?

I could but it will require some extra work which I am trying to avoid. Thanks though

Is the result always a square or always continuous between rows columns?

nonzeros = torch.nonzero(tensor != DUMMY)
c_min, c_max, r_min, r_max = nonzeros[:, 0].min(), nonzeros[:, 0].max(), nonzeros[:, 1].min(), nonzeros[:, 1].max()
tensor = tensor[c_min:c_max+1, r_min:r_max+1]
1 Like