bundles / scipy 1.18.0 / scipy / linalg / _basic / pinv
function
scipy.linalg._basic:pinv
source: /scipy/linalg/_basic.py:1471
Signature
def pinv(a, *, atol = None, rtol = None, return_rank = False, check_finite = True)Summary
Compute the (Moore-Penrose) pseudo-inverse of a matrix.
Extended Summary
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 of a, then the significance cut-off value is determined by atol + rtol * s. Any singular value below this value is assumed insignificant.
The a array argument 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 linalg_batch for details.
Parameters
a: (..., M, N) array_likeMatrix to be pseudo-inverted.
atol: float, optionalAbsolute threshold term, default value is 0.
rtol: float, optionalRelative threshold term, default value is
max(M, N) * epswhereepsis the machine precision value of the datatype ofa.return_rank: bool, optionalIf True, return the effective rank of the matrix.
check_finite: bool, optionalWhether 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) ndarrayThe pseudo-inverse of matrix
a.rank: intThe effective rank of the matrix. Returned if
return_rankis True.
Raises
: LinAlgErrorIf SVD computation does not converge.
Notes
If A is invertible then the Moore-Penrose pseudoinverse is exactly the inverse of A [1]. If A is not invertible then the Moore-Penrose pseudoinverse computes the x solution to Ax = b such that ||Ax - b|| is minimized [1].
Examples
Given an ``m x n`` matrix ``A`` and an ``n x m`` matrix ``B`` the four Moore-Penrose conditions are: 1. ``ABA = A`` (``B`` is a generalized inverse of ``A``), 2. ``BAB = B`` (``A`` is a generalized inverse of ``B``), 3. ``(AB)* = AB`` (``AB`` is hermitian), 4. ``(BA)* = BA`` (``BA`` is hermitian) [1]_. Here, ``A*`` denotes the conjugate transpose. The Moore-Penrose pseudoinverse is a unique ``B`` that satisfies all four of these conditions and exists for any ``A``. 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 np.allclose(B @ A @ B, B) # Condition 2 np.allclose((A @ B).conj().T, A @ B) # Condition 3 np.allclose((B @ A).conj().T, B @ A) # Condition 4✓
TrueIf the input array has more than two dimensions, it is interpreted as a batch of two-dimensional slices:
a = np.stack((np.zeros((3, 3)), np.eye(3))) p, ranks = linalg.pinv(a, return_rank=True) p.shape ranks✓
array([0, 3])
See also
- pinvh
Moore-Penrose pseudoinverse of a hermitian matrix.
Aliases
scipy.linalg.pinv