Один простой способ будет einsum
:
A_ = np.einsum("ij,j,jk->jik",U[:,:len(VT)],S,VT[:len(U)]).cumsum(0)
Если, как вы правильно сделали, svd
был вызван с full_matrices=False
, это упрощается до
A_ = np.einsum("ij,j,jk->jik",U,S,VT).cumsum(0)
Ваш A_1
будет соответствовать A_[0]
и т. Д., A_[-1]
является (с точностью до округления) исходным массивом A
.
П.С .: То же самое без einsum
:
A_ = ((U*S).T[:,:,None]*VT[:,None,:]).cumsum(0)