Вы можете пройти большую часть пути с помощью diag
:
>>> u, s, vh = np.linalg.svd(a)
>>> np.diag(s)
array([[ 4. , 0. , 0. , 0. ],
[ 0. , 3. , 0. , 0. ],
[ 0. , 0. , 2.23606798, 0. ],
[ 0. , 0. , 0. , -0. ]])
Обратите внимание, что вольфрам альфа дает дополнительный ряд. Получение этого чуть более сложное:
>>> sigma = np.zeros(A.shape, s.dtype)
>>> np.fill_diagonal(sigma, s)
>>> sigma
array([[ 4. , 0. , 0. , 0. ],
[ 0. , 3. , 0. , 0. ],
[ 0. , 0. , 2.23606798, 0. ],
[ 0. , 0. , 0. , -0. ],
[ 0. , 0. , 0. , 0. ]])
В зависимости от вашей цели, удаление столбца из U может быть лучшим подходом, чем добавление строки нулей в сигма. Это будет выглядеть так:
>>> u, s, vh = np.linalg.svd(a, full_matrices=False)