pinv#
- scipy.linalg.pinv(a, *, atol=None, rtol=None, return_rank=False, check_finite=True)[source]#
Compute the (Moore-Penrose) pseudo-inverse of a matrix.
Calculate a generalized inverse of a matrix using its singular-value decomposition
U @ S @ V
in the economy mode and picking up only the columns/rows that are associated with significant singular values.If
s
is the maximum singular value ofa
, then the significance cut-off value is determined byatol + rtol * s
. Any singular value below this value is assumed insignificant.The documentation is written assuming array arguments are of specified “core” shapes. However, array argument(s) of this function may have additional “batch” dimensions prepended to the core shape. In this case, the array is treated as a batch of lower-dimensional slices; see Batched Linear Operations for details.
- Parameters:
- a(M, N) array_like
Matrix to be pseudo-inverted.
- atolfloat, optional
Absolute threshold term, default value is 0.
Added in version 1.7.0.
- rtolfloat, optional
Relative threshold term, default value is
max(M, N) * eps
whereeps
is the machine precision value of the datatype ofa
.Added in version 1.7.0.
- return_rankbool, optional
If True, return the effective rank of the matrix.
- check_finitebool, optional
Whether to check that the input matrix contains only finite numbers. Disabling may give a performance gain, but may result in problems (crashes, non-termination) if the inputs do contain infinities or NaNs.
- Returns:
- B(N, M) ndarray
The pseudo-inverse of matrix a.
- rankint
The effective rank of the matrix. Returned if return_rank is True.
- Raises:
- LinAlgError
If SVD computation does not converge.
See also
pinvh
Moore-Penrose pseudoinverse of a hermitian matrix.
Notes
If
A
is invertible then the Moore-Penrose pseudoinverse is exactly the inverse ofA
[1]. IfA
is not invertible then the Moore-Penrose pseudoinverse computes thex
solution toAx = b
such that||Ax - b||
is minimized [1].References
Examples
Given an
m x n
matrixA
and ann x m
matrixB
the four Moore-Penrose conditions are:ABA = A
(B
is a generalized inverse ofA
),BAB = B
(A
is a generalized inverse ofB
),(AB)* = AB
(AB
is hermitian),(BA)* = BA
(BA
is hermitian) [1].
Here,
A*
denotes the conjugate transpose. The Moore-Penrose pseudoinverse is a uniqueB
that satisfies all four of these conditions and exists for anyA
. Note that, unlike the standard matrix inverse,A
does not have to be a square matrix or have linearly independent columns/rows.As an example, we can calculate the Moore-Penrose pseudoinverse of a random non-square matrix and verify it satisfies the four conditions.
>>> import numpy as np >>> from scipy import linalg >>> rng = np.random.default_rng() >>> A = rng.standard_normal((9, 6)) >>> B = linalg.pinv(A) >>> np.allclose(A @ B @ A, A) # Condition 1 True >>> np.allclose(B @ A @ B, B) # Condition 2 True >>> np.allclose((A @ B).conj().T, A @ B) # Condition 3 True >>> np.allclose((B @ A).conj().T, B @ A) # Condition 4 True