numpy求解无环的3d线性方程


问题内容

我想求解线性方程Ax = b,每个A包含在3d矩阵中。例如,

在Ax = B中,假设A.shape为(2,3,3)

即= [[[1,2,3],[1,2,3],[1,2,3]] [[1,2,3],[1,2,3],[1,2, 3]]]

并且B.shape是(3,1)即[1,2,3] ^ T

我想知道Ax = B的每个3矢量 x 即(x_1,x_2,x_3)。

我想到的是将B与np.ones(2,3)相乘,然后将功能点与每个A元素的反函数一起使用。但这需要循环来完成。(当矩阵大小变高时,这会花费大量时间)(例如A
[:] [:] = [1,2,3])如何在没有矩阵的情况下求解许多Ax = B方程循环?

  • 我使A和B的元素相同,但是您可能知道,这只是示例。

问题答案:

对于可逆矩阵,我们可以np.linalg.inv3D数组上A使用,然后使用张量矩阵乘法与,B这样我们就分别失去了这两个数组的最后和第一个轴,就像这样-

np.tensordot( np.linalg.inv(A), B, axes=((-1),(0)))

样品运行-

In [150]: A
Out[150]: 
array([[[ 0.70454189,  0.17544101,  0.24642533],
        [ 0.66660371,  0.54608536,  0.37250876],
        [ 0.18187631,  0.91397945,  0.55685133]],

       [[ 0.81022308,  0.07672197,  0.7427768 ],
        [ 0.08990586,  0.93887203,  0.01665071],
        [ 0.55230314,  0.54835133,  0.30756205]]])

In [151]: B = np.array([[1],[2],[3]])

In [152]: np.linalg.solve(A[0], B)
Out[152]: 
array([[ 0.23594665],
       [ 2.07332454],
       [ 1.90735086]])

In [153]: np.linalg.solve(A[1], B)
Out[153]: 
array([[ 8.43831557],
       [ 1.46421396],
       [-8.00947932]])

In [154]: np.tensordot( np.linalg.inv(A), B, axes=((-1),(0)))
Out[154]: 
array([[[ 0.23594665],
        [ 2.07332454],
        [ 1.90735086]],

       [[ 8.43831557],
        [ 1.46421396],
        [-8.00947932]]])

另外,张量矩阵乘法可以用代替np.matmul,像这样-

np.matmul(np.linalg.inv(A), B)

在Python
3.x上,我们可以使用@operator来实现相同的功能-

np.linalg.inv(A) @ B