我想求解线性方程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的元素相同,但是您可能知道,这只是示例.
解决方法:
对于可逆矩阵,我们可以在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