bundles / numpy 2.4.3 / numpy / linalg / svd
_ArrayFunctionDispatcher
numpy.linalg:svd
source: /numpy/linalg/_linalg.py :1668
Signature
def svd ( a , full_matrices = True , compute_uv = True , hermitian = False ) Summary
Singular Value Decomposition.
Extended Summary
When a is a 2D array, and full_matrices=False, then it is factorized as u @ np.diag(s) @ vh = (u * s) @ vh, where u and the Hermitian transpose of vh are 2D arrays with orthonormal columns and s is a 1D array of a's singular values. When a is higher-dimensional, SVD is applied in stacked mode as explained below.
Parameters
a: (..., M, N) array_likeA real or complex array with
a.ndim >= 2.full_matrices: bool, optionalIf True (default),
uandvhhave the shapes(..., M, M)and(..., N, N), respectively. Otherwise, the shapes are(..., M, K)and(..., K, N), respectively, whereK = min(M, N).compute_uv: bool, optionalWhether or not to compute
uandvhin addition tos. True by default.hermitian: bool, optionalIf True,
ais assumed to be Hermitian (symmetric if real-valued), enabling a more efficient method for finding singular values. Defaults to False.
Returns
U: { (..., M, M), (..., M, K) } arrayUnitary array(s). The first
a.ndim - 2dimensions have the same size as those of the inputa. The size of the last two dimensions depends on the value offull_matrices. Only returned whencompute_uvis True.S: (..., K) arrayVector(s) with the singular values, within each vector sorted in descending order. The first
a.ndim - 2dimensions have the same size as those of the inputa.Vh: { (..., N, N), (..., K, N) } arrayUnitary array(s). The first
a.ndim - 2dimensions have the same size as those of the inputa. The size of the last two dimensions depends on the value offull_matrices. Only returned whencompute_uvis True.
Raises
: LinAlgErrorIf SVD computation does not converge.
Notes
When compute_uv is True, the result is a namedtuple with the following attribute names: U, S, and Vh.
The decomposition is performed using LAPACK routine _gesdd.
SVD is usually described for the factorization of a 2D matrix . The higher-dimensional case will be discussed below. In the 2D case, SVD is written as , where , , and . The 1D array s contains the singular values of a and u and vh are unitary. The rows of vh are the eigenvectors of and the columns of u are the eigenvectors of . In both cases the corresponding (possibly non-zero) eigenvalues are given by s**2.
If a has more than two dimensions, then broadcasting rules apply, as explained in routines.linalg-broadcasting. This means that SVD is working in "stacked" mode: it iterates over all indices of the first a.ndim - 2 dimensions and for each combination SVD is applied to the last two indices. The matrix a can be reconstructed from the decomposition with either (u * s[..., None, :]) @ vh or u @ (s[..., None] * vh). (The @ operator can be replaced by the function np.matmul for python versions below 3.5.)
If a is a matrix object (as opposed to an ndarray), then so are all the return values.
Examples
import numpy as np rng = np.random.default_rng() a = rng.normal(size=(9, 6)) + 1j*rng.normal(size=(9, 6)) b = rng.normal(size=(2, 7, 8, 3)) + 1j*rng.normal(size=(2, 7, 8, 3))✓
U, S, Vh = np.linalg.svd(a, full_matrices=True) U.shape, S.shape, Vh.shape np.allclose(a, np.dot(U[:, :6] * S, Vh)) smat = np.zeros((9, 6), dtype=complex) smat[:6, :6] = np.diag(S) np.allclose(a, np.dot(U, np.dot(smat, Vh)))✓
U, S, Vh = np.linalg.svd(a, full_matrices=False) U.shape, S.shape, Vh.shape np.allclose(a, np.dot(U * S, Vh)) smat = np.diag(S) np.allclose(a, np.dot(U, np.dot(smat, Vh)))✓
U, S, Vh = np.linalg.svd(b, full_matrices=True) U.shape, S.shape, Vh.shape np.allclose(b, np.matmul(U[..., :3] * S[..., None, :], Vh)) np.allclose(b, np.matmul(U[..., :3], S[..., None] * Vh))✓
U, S, Vh = np.linalg.svd(b, full_matrices=False) U.shape, S.shape, Vh.shape np.allclose(b, np.matmul(U * S[..., None, :], Vh)) np.allclose(b, np.matmul(U, S[..., None] * Vh))✓
See also
- scipy.linalg.svd
Similar function in SciPy.
- scipy.linalg.svdvals
Compute singular values of a matrix.
Aliases
-
numpy.linalg.svd