Вот три строки:
a = np.array([[1, 2],
[-1, 4],
[1, 6],
[-1, 8]])
b = np.zeros(np.arange(2) + a.shape, a.dtype)
np.put_along_axis(b, *a[None].T, 1)
np.c_[a, b[:, 1:].cumsum(0)]
# array([[ 1, 2, 2, 0],
# [-1, 4, 2, 4],
# [ 1, 6, 8, 4],
# [-1, 8, 8, 12]])
И вариант, который немного быстрее в основном потому, что он избавляется от удобного, но медленного np.c_
b = np.zeros_like(a)
np.put_along_axis(b, a[:,:1].clip(None, 0), a[:,1:], 1)
np.concatenate([a, b.cumsum(0)], 1)
# array([[ 1, 2, 2, 0],
# [-1, 4, 2, 4],
# [ 1, 6, 8, 4],
# [-1, 8, 8, 12]])