【问题标题】:Numpy solving 3d linear equation without loopNumpy 求解没有循环的 3d 线性方程
【发布时间】:2017-06-16 23:00:33
【问题描述】:

我想求解线性方程 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) 相乘,并将函数 dot 与每个 A 元素的倒数一起使用。但它需要循环来执行此操作。(当矩阵大小变高时会消耗大量时间)(例如 A[:][:] = [1,2,3]) 如何在没有循环的情况下求解多个 Ax = B 方程?

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

【问题讨论】:

    标签: python numpy matrix vectorization


    【解决方案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
    

    【讨论】:

    • 如果是 4d 矩阵会发生什么?这有同样的程序吗?
    • @구마왕 是的,无需更改。
    • 张量点中的负值“-1”是什么?我想应该是'1'
    • @구마왕 -1 是选择/表示最后一个轴。在 Python 中,它用于选择最后一个轴或最后一个元素等。因此,-1 的用法在这里是有意的,而不是错字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多