scipy.linalg.pinv(a, atol=None, rtol=None, return_rank=False, check_finite=True, cond=None, rcond=None)[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 of a, then the significance cut-off value is determined by atol + rtol * s. Any singular value below this value is assumed insignificant.

a(M, N) array_like

Matrix to be pseudo-inverted.

atol: float, optional

Absolute threshold term, default value is 0.

New in version 1.7.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.

New 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.

cond, rcondfloat, optional

In older versions, these values were meant to be used as atol with rtol=0. If both were given rcond overwrote cond and hence the code was not correct. Thus using these are strongly discouraged and the tolerances above are recommended instead. In fact, if provided, atol, rtol takes precedence over these keywords.

Changed in version 1.7.0: Deprecated in favor of rtol and atol parameters above and will be removed in future versions of SciPy.

Changed in version 1.3.0: Previously the default cutoff value was just eps*f where f was 1e3 for single precision and 1e6 for double precision.

B(N, M) ndarray

The pseudo-inverse of matrix a.


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


If SVD computation does not converge.


>>> from scipy import linalg
>>> rng = np.random.default_rng()
>>> a = rng.standard_normal((9, 6))
>>> B = linalg.pinv(a)
>>> np.allclose(a, a @ B @ a)
>>> np.allclose(B, B @ a @ B)