idx = np.where(~mask, np.arange(mask.shape[1]), 0)
np.maximum.accumulate(idx, axis=1, out=idx)
out = arr[np.arange(idx.shape[0])[:, (None)], idx]
Самый эффективный способ прямого заполнения значений NaN в массиве numpy