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

dhpollack
(David Pollack)
#9
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