This is a pre-release version (latest).Go to latest (1.18.0)
{ } Raw JSON

bundles / scipy latest / scipy / linalg / _basic / pinv

function

scipy.linalg._basic:pinv

source: build-install/usr/lib/python3.14/site-packages/scipy/linalg/_basic.py:1475

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.

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 linalg_batch for details.

Parameters

a : (..., M, N) array_like

Matrix to be pseudo-inverted.

atol : float, optional

Absolute threshold term, default value is 0.

rtol : float, optional

Relative threshold term, default value is max(M, N) * eps where eps is the machine precision value of the datatype of a.

return_rank : bool, optional

If True, return the effective rank of the matrix.

check_finite : bool, 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.

rank : int

The effective rank of the matrix. Returned if return_rank is True.

Raises

: LinAlgError

If 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
✓
True
If 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

Referenced by