LinAlgError:数组的最后 2 个维度必须是正方形

问题描述 投票:0回答:3

我需要求解 x 的一组 Ax = B 形式的联立方程。我使用了

numpy.linalg.solve
功能,输入
A
B
,但出现错误

LinAlgError: Last 2 dimensions of the array must be square

这是我的代码:

A = numpy.matrix([(-0.56, -0.52), (0.44, 0.46), (0.69, 0.71)])
B = [(-0.38, -24.09, 0.0)]
x = numpy.linalg.solve(A, B)

x 的形式应为 (x1,x2,0)。

我该如何解决这个问题?

python numpy linear-algebra
3个回答
32
投票

如果你还没有找到答案,或者将来有人有这个问题。

求解Ax=b:

numpy.linalg.solve
使用LAPACK gesv。正如LAPACK文档中提到的,gesv要求A是正方形:

LA_GESV 计算实数或复数线性方程组 AX = B 的解,其中 A 是方阵,X 和 B 是矩形矩阵或向量。使用行交换的高斯消去法将 A 分解为 A = PL*U ,其中 P 是置换矩阵,L 是单位下三角,U 是上三角。然后使用 A 的因式分解形式来求解上述系统。

如果 A 矩阵不是方阵,则意味着您的变量要么比方程多,要么反之亦然。在这些情况下,可能会出现无解或有无限多个解的情况。决定解空间的是矩阵的秩与列数的比较。因此,您首先必须检查矩阵的秩。

话虽这么说,您可以使用另一种方法来求解线性方程组。我建议看看分解方法,如 LU 或 QR 甚至 SVD。在 LAPACK 中你可以使用

getrs
,在 Python 中你可以使用不同的东西:

  • 首先像 QR 一样进行因式分解,然后将得到的矩阵输入到像
    scipy.linalg.solve_triangular
  • 这样的方法
  • 使用
    numpy.linalg.lstsq
  • 求解最小二乘法

另请查看此处,其中制定并解决了一个简单的示例。


4
投票

方阵是行数和列数相同的矩阵。您正在做的矩阵是 3 x 2。添加一列零来解决此问题。


0
投票

发生此错误的另一种常见方式是在

numpy.matrix()
对象上调用旨在按元素执行的操作时。以下示例重现了此错误。在这种情况下,
arr
是一个 numpy ndarray,而
mat
是一个 numpy 矩阵对象。如您所见,逐元素求方适用于
arr
,但不适用于
mat
,因为
**2
是一个矩阵平方,相当于点积。要解决这个问题,请将矩阵转换为 ndarray。

import numpy as np
arr = np.array([[1,2]])
mat = np.matrix([[1,2]])

x1 = arr**2             # array([[1, 4]])
y1 = mat**2             # LinAlgError: Last 2 dimensions of the array must be square
y2 = np.array(mat)**2   # array([[1, 4]])
© www.soinside.com 2019 - 2024. All rights reserved.