线性代数 (numpy.linalg)#

NumPy 的线性代数函数依赖于 BLAS 和 LAPACK 来提供标准线性代数算法的高效底层实现。这些库可能由 NumPy 本身使用其参考实现子集的 C 版本提供,但是,只要可能,优先使用利用专用处理器功能的高度优化的库。此类库的示例包括 OpenBLAS、MKL (TM) 和 ATLAS。因为这些库是多线程的并且依赖于处理器,所以可能需要环境变量和外部包,例如 threadpoolctl 来控制线程数量或指定处理器架构。

SciPy 库也包含一个 linalg 子模块,并且 SciPy 和 NumPy 子模块提供的功能存在重叠。SciPy 包含在 numpy.linalg 中找不到的函数,例如与 LU 分解和 Schur 分解相关的函数、计算伪逆的多种方法以及矩阵超越函数,例如矩阵对数。某些同时存在的函数在 scipy.linalg 中具有增强的功能。例如,scipy.linalg.eig 可以采用第二个矩阵参数来求解广义特征值问题。但是,NumPy 中的某些函数具有更灵活的广播选项。例如,numpy.linalg.solve 可以处理“堆叠”数组,而 scipy.linalg.solve 只接受单个方阵作为其第一个参数。

注意

本页中使用的术语“矩阵”表示一个二维 numpy.array 对象,而不是 numpy.matrix 对象。即使对于线性代数,也不再推荐后者。有关更多信息,请参阅 矩阵对象文档

@ 运算符#

在 NumPy 1.10.0 中引入的 @ 运算符在计算二维数组之间的矩阵乘积时比其他方法更可取。numpy.matmul 函数实现了 @ 运算符。

矩阵和向量积#

dot(a, b[, out])

两个数组的点积。

linalg.multi_dot(arrays, *[, out])

在一个函数调用中计算两个或多个数组的点积,同时自动选择最快的计算顺序。

vdot(a, b, /)

返回两个向量的点积。

vecdot(x1, x2, /[, out, casting, order, ...])

两个数组的向量点积。

linalg.vecdot(x1, x2, /, *[, axis])

计算向量点积。

inner(a, b, /)

两个数组的内积。

outer(a, b[, out])

计算两个向量的外积。

matmul(x1, x2, /[, out, casting, order, ...])

两个数组的矩阵乘积。

linalg.matmul(x1, x2, /)

计算矩阵乘积。

matvec(x1, x2, /[, out, casting, order, ...])

两个数组的矩阵向量点积。

vecmat(x1, x2, /[, out, casting, order, ...])

两个数组的向量矩阵点积。

tensordot(a, b[, axes])

沿指定的轴计算张量点积。

linalg.tensordot(x1, x2, /, *[, axes])

沿指定的轴计算张量点积。

einsum(subscripts, *operands[, out, dtype, ...])

对操作数评估爱因斯坦求和约定。

einsum_path(subscripts, *operands[, optimize])

评估einsum表达式的最低成本收缩顺序,考虑中间数组的创建。

linalg.matrix_power(a, n)

将方阵乘以(整数)幂n

kron(a, b)

两个数组的克罗内克积。

linalg.cross(x1, x2, /, *[, axis])

返回3元素向量的叉积。

分解#

linalg.cholesky(a, /, *[, upper])

Cholesky分解。

linalg.outer(x1, x2, /)

计算两个向量的外积。

linalg.qr(a[, mode])

计算矩阵的QR分解。

linalg.svd(a[, full_matrices, compute_uv, ...])

奇异值分解。

linalg.svdvals(x, /)

返回矩阵(或矩阵堆栈)x的奇异值。

矩阵特征值#

linalg.eig(a)

计算方阵的特征值和右特征向量。

linalg.eigh(a[, UPLO])

返回复厄米特(共轭对称)或实对称矩阵的特征值和特征向量。

linalg.eigvals(a)

计算一般矩阵的特征值。

linalg.eigvalsh(a[, UPLO])

计算复厄米特或实对称矩阵的特征值。

范数和其他数字#

linalg.norm(x[, ord, axis, keepdims])

矩阵或向量的范数。

linalg.matrix_norm(x, /, *[, keepdims, ord])

计算矩阵(或矩阵堆栈)x的矩阵范数。

linalg.vector_norm(x, /, *[, axis, ...])

计算向量(或向量批次)x的向量范数。

linalg.cond(x[, p])

计算矩阵的条件数。

linalg.det(a)

计算数组的行列式。

linalg.matrix_rank(A[, tol, hermitian, rtol])

使用SVD方法返回数组的矩阵秩。

linalg.slogdet(a)

计算数组行列式的符号和(自然)对数。

trace(a[, offset, axis1, axis2, dtype, out])

返回数组对角线的和。

linalg.trace(x, /, *[, offset, dtype])

返回矩阵(或矩阵堆栈)x指定对角线的和。

解方程和求逆矩阵#

linalg.solve(a, b)

解线性矩阵方程或线性标量方程组。

linalg.tensorsolve(a, b[, axes])

求解张量方程a x = b 的 x。

linalg.lstsq(a, b[, rcond])

返回线性矩阵方程的最小二乘解。

linalg.inv(a)

计算矩阵的逆。

linalg.pinv(a[, rcond, hermitian, rtol])

计算矩阵的(Moore-Penrose)伪逆。

linalg.tensorinv(a[, ind])

计算N维数组的“逆”。

其他矩阵运算#

diagonal(a[, offset, axis1, axis2])

返回指定的对角线。

linalg.diagonal(x, /, *[, offset])

返回矩阵(或矩阵堆栈)x的指定对角线。

linalg.matrix_transpose(x, /)

转置矩阵(或矩阵堆栈)x

异常#

linalg.LinAlgError

linalg 函数引发的通用 Python 异常派生对象。

一次对多个矩阵进行线性代数运算#

上面列出的几个线性代数例程能够一次计算多个矩阵的结果,如果它们堆叠到同一个数组中。

这在文档中通过输入参数规范(例如a : (..., M, M) array_like)来指示。这意味着,例如,如果给定一个输入数组a.shape == (N, M, M),则将其解释为 N 个 M×M 矩阵的“堆栈”。类似的规范也适用于返回值,例如,行列式具有det : (...),在这种情况下,它将返回一个形状为det(a).shape == (N,)的数组。这可以推广到对高维数组的线性代数运算:多维数组的最后 1 或 2 维被解释为向量或矩阵,这取决于每个运算。