I need to find a way to perform this operation, i have an array of shape
[ batch_size , 150 , 1 ]
representing batch_size sequences of integers, each sequence is 150 elements long, but in each one there are a lot of zeros that were added in order to make all the sequences of the same length. I need to find the last nonzero element for each sequence, and put it in an array, the shape of this array has to be [ batch_size ] . I'd try the following :
last = []
for j in range(0 , inputs.shape[0] ):
tnew = np.array( inputs[j][:][0] )
tnew = np.trim_zeros(tnew )
last.append( int(tnew[-1]) )
but I don't know if there is a better way to do this, with out having to loop over each element like that.
Thanks for your answers and help.
Test data
a = np.array([[[1],[0],[0],[0],[0],[0]],
[[1],[2],[0],[0],[0],[0]],
[[1],[2],[3],[0],[0],[0]],
[[1],[2],[3],[4],[0],[0]],
[[1],[2],[3],[4],[5],[0]]])
Here's one vectorized approach -
a.shape[1] - (a!=0)[:,::-1].argmax(1) - 1
Sample run -
In [191]: a = np.random.randint(0,3,(3,6,1))
In [192]: a
Out[192]:
array([[[2],
[1],
[2],
[2],
[2],
[0]],
[[2],
[1],
[1],
[0],
[2],
[0]],
[[2],
[1],
[2],
[0],
[1],
[1]]])
In [193]: a.shape[1] - (a!=0)[:,::-1].argmax(1) - 1
Out[193]:
array([[4],
[4],
[5]])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With