首页 > 解决方案 > 错误:数组的最后 2 个维度必须是正方形

问题描述

我定义uv

u = np.array([[1],
              [1]])

v = np.array([[1],
              [-1]])

我想找到A

Au = np.array([[3],
               [2]])
Av = np.array([[-1],
               [-2]])

所以我这样编码

A = np.linalg.solve(u,Au)
A = np.linalg.solve(v,Av)
print(A)

然后我得到了错误

LinAlgError                               Traceback (most recent call last)
<ipython-input-21-416fc4de15b6> in <module>
     12                [-2]])
     13 
---> 14 A = np.linalg.solve(u,Au)
     15 A = np.linalg.solve(v,Av)
     16 print(A)

    <__array_function__ internals> in solve(*args, **kwargs)
    
    ~\anaconda3\lib\site-packages\numpy\linalg\linalg.py in solve(a, b)
        384     a, _ = _makearray(a)
        385     _assert_stacked_2d(a)
    --> 386     _assert_stacked_square(a)
        387     b, wrap = _makearray(b)
        388     t, result_t = _commonType(a, b)
    
    ~\anaconda3\lib\site-packages\numpy\linalg\linalg.py in _assert_stacked_square(*arrays)
        211         m, n = a.shape[-2:]
        212         if m != n:
    --> 213             raise LinAlgError('Last 2 dimensions of the array must be square')
        214 
        215 def _assert_finite(*arrays):
    
    LinAlgError: Last 2 dimensions of the array must be square

我该如何解决?

标签: pythonnumpy

解决方案


假设这A两个方程是相同的,你有 4 个方程和 4 个未知数:

A[0, 0] * u[0] + A[0][1] * u[1] = Au[0]
A[1, 0] * u[0] + A[1][1] * u[1] = Au[1]
A[0, 0] * v[0] + A[0][1] * v[1] = Av[0]
A[1, 0] * v[0] + A[1][1] * v[1] = Av[1]

这可以改写为一个矩阵方程B a = Auv,其中

  • aA是向量中的值
  • Auv是连接的向量,Au并且Av
  • B包含 和 的uv
import numpy as np

u = [1, 1]
v = [1, -1]
Au = [3, 2]
Av = [-1, -2]
B = [
    [u[0], u[1], 0, 0],
    [0, 0, u[0], u[1]],
    [v[0], v[1], 0, 0],
    [0, 0, v[0], v[1]]]

Auv = np.concatenate([Au, Av])

A = np.linalg.solve(B, Auv).reshape(2, 2)

print("A:\n", A)

矩阵A是:

1 2
0 2

推荐阅读