Единственный немного хитрый бит - это «расширение» s
Если у вас установлено scipy
, у него есть scipy.linalg.diagsvd
, который может сделать это для вас:
>>> import numpy as np
>>> import scipy.linalg as la
>>>
>>> rng = np.random.default_rng()
>>> A = rng.uniform(-1,1,(4,3))
>>> u,s,v = np.linalg.svd(A)
>>>
>>> B = u@la.diagsvd(s,*A.shape)@v
>>>
>>> np.allclose(A,B)
True