首页 文章

Numpy解决没有循环的3d线性方程

提问于
浏览
2

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

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

ie = [[[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)相乘,并使用函数dot和每个A元素的倒数 . 但它需要循环才能做到这一点 . (当矩阵大小上升时,这会花费大量时间)(例如A [:] [:] = [1,2,3])如何在没有Ax = B方程的情况下解决环?

  • 我使A和B的元素相同,但你可能知道,这只是一个例子 .

1 回答

  • 1

    对于可逆矩阵,我们可以在 3D 数组 A 上使用np.linalg.inv然后使用张量矩阵乘法与 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
    

相关问题