scipy.linalg.svd разлагает "любой" массив от A до U, s, VT. Примером может быть:
from numpy import array
from scipy.linalg import svd
import numpy as np
# define a matrix
A = np.arange(200).reshape((100,2))
print ('A.shape',A.shape)
U, s, VT = svd(A)
print ('U.shape',U.shape)
print ('s.shape',s.shape)
print ('VT.shape',VT.shape)
s_diag = np.zeros((100,2))
np.fill_diagonal(s_diag, s)
print(np.allclose(A,np.dot(np.dot(U,s_diag),VT)))
.png
Когда A.shape == (m,n)
, формами массивов U и VT по умолчанию являются и (m, m) и (n, n).Я отмечаю, что есть вариант (full_matrices
) того, что я ожидал бы, например: Что я не могу понять, это , почему U и VT должны были бы быть (м, м) и (n, n)? При умножении, поскольку s_diag является «диагональю», единственные используемые части таблиц U и VT в любом случае меньше ... (например, в примере размер U может быть просто100,2 ...)