Numpy 无循环求解 3d 线性方程

2023-12-10

我想求解线性方程 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

我想知道每个 3 向量xAx = B 即(x_1, x_2, x_3)。

我想到的是将 B 与 np.ones(2,3) 相乘,并使用函数 dot 与每个 A 元素的逆。但它需要循环来做到这一点。(当矩阵大小变高时,这会消耗大量时间)(例如A[:][:] = [1,2,3]) 如何在没有循环的情况下求解多个 Ax = B 方程?

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

对于可逆矩阵,我们可以使用np.linalg.inv on the 3D array 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 上,我们可以使用@操作员对于相同的功能 -

np.linalg.inv(A) @ B
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Numpy 无循环求解 3d 线性方程 的相关文章

随机推荐