cupyx.scipy.linalg.lu_factor(a, overwrite_a=False, check_finite=True)

LU decomposition.

Decompose a given two-dimensional square matrix into P * L * U, where P is a permutation matrix, L lower-triangular with unit diagonal elements, and U upper-triangular matrix. Note that in the current implementation a must be a real matrix, and only numpy.float32 and numpy.float64 are supported.

  • a (cupy.ndarray) – The input matrix with dimension (M, N)

  • overwrite_a (bool) – Allow overwriting data in a (may enhance performance)

  • check_finite (bool) – Whether to check that the input matrices contain 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.


(lu, piv) where lu is a cupy.ndarray storing U in its upper triangle, and L without unit diagonal elements in its lower triangle, and piv is a cupy.ndarray storing pivot indices representing permutation matrix P. For 0 <= i < min(M,N), row i of the matrix was interchanged with row piv[i]

Return type



Current implementation returns result different from SciPy when the matrix singular. SciPy returns an array containing 0. while the current implementation returns an array containing nan.

>>> import numpy as np
>>> import scipy.linalg
>>> scipy.linalg.lu_factor(np.array([[0, 1], [0, 0]], dtype=np.float32))
(array([[0., 1.],
       [0., 0.]], dtype=float32), array([0, 1], dtype=int32))
>>> import cupy as cp
>>> import cupyx.scipy.linalg
>>> cupyx.scipy.linalg.lu_factor(cp.array([[0, 1], [0, 0]], dtype=cp.float32))
(array([[ 0.,  1.],
       [nan, nan]], dtype=float32), array([0, 1], dtype=int32))