Это обобщает до n размерных массивов.Он перебирает n-1d фрагменты массива.
In [26]: a=np.array([
...: [ 0, 0,10, 0, 0, 0,20,30, 0, 0],
...: [ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0],
...: [ 0, 5, 0, 6, 0, 7, 0, 8, 0, 9]])
In [27]: bfwd=0
...: for ix in range(a.shape[-1]):
...: sel=np.s_[... ,ix]
...: a[sel]=bfwd*(a[sel]==0)+a[sel] # If a is zero use bfwd else use a
...: bfwd=a[sel]
In [28]: a
Out[28]:
array([[ 0, 0, 10, 10, 10, 10, 20, 30, 30, 30],
[ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
[ 0, 5, 5, 6, 6, 7, 7, 8, 8, 9]])
HTH