# How do I turn a float tensor into one hot tensor with the first non zero dimension on?

I have a tensor of floats and want to mark the first non-zero entry.
So using single dimension examples:
[0., 0.5, 0.3] would turn to [0,1,0] and [-2.,1.,1.] to [1,0,0]

In my case, I have a 3 dim tensor and want to do it along the first dim.
I couldn’t find a simple way of doing it using tensor operations. Right now I am using for loops which is quite slow.

Here is my code using for loops:

``````num_stacks,N1,N2 = tensor.shape

flatten_tensor_with_distance_dim_last = tensor.permute(1, 2, 0).view(-1, num_stacks)
for distance_tensor in flatten_tensor_with_distance_dim_last:
non_zero_entry_visited = False
for i in range(len(distance_tensor)):
if non_zero_entry_visited:
distance_tensor[i] = 0.
elif distance_tensor[i] > 0.:
non_zero_entry_visited = True
distance_tensor[i] = 1.
# back to original shape
return flatten_tensor_with_distance_dim_last.view(N1, N2, num_stacks).permute(2, 0, 1)
``````

Thanks!

Hi Dg!

``````>>> import torch
>>> torch.__version__
'1.10.2'
>>> t = torch.tensor ([[0.0, -2.0], [0.5, 1.0], [0.3, 1.0]])
>>> (((t != 0).cumsum (0).cumsum (0)) == 1).long()
tensor([[0, 1],
[1, 0],
[0, 0]])
``````

Best.

K. Frank