3d 和 1d 数组的乘积和求和
Product and summation with 3d and 1d arrays
给定一个维度为 (K,n,m
) 的 3d 数组 X
,可以将其视为 K
(n,m
) 矩阵和一维向量 b
(dim n
),目标是获得结果向量 r
(dim n
) 其中每个分量计算如下:
很容易看出k
求和下的表达式(即两个内和)只是点积X_k b X_k
(和,因此,可以使用 numpy
) 轻松计算。所以,想要的向量r
是
其中 X_k
是第 k
-th 2d (n,m
) 'layer' 的 3d 数组 X
.
即当前的解决方案是
r = 0
for k in range(K):
r += x[k,:,:] @ (b @ x[k, :, :])
r
能否通过 k
有效计算避免 for 循环?
或者也许还有另一种有效的方法来计算 r
?
(我尝试了 np.tensordot
但由于它只是 k
的纯粹求和,我还没有得到正确的结果。)
这看起来是 einsum 的完美用例:
r = np.einsum('kij,l,klj->i', x, b, x)
这将矢量化操作,例如它比 for 循环更优化。
给定一个维度为 (K,n,m
) 的 3d 数组 X
,可以将其视为 K
(n,m
) 矩阵和一维向量 b
(dim n
),目标是获得结果向量 r
(dim n
) 其中每个分量计算如下:
很容易看出k
求和下的表达式(即两个内和)只是点积X_k b X_k
(和,因此,可以使用 numpy
) 轻松计算。所以,想要的向量r
是
其中 X_k
是第 k
-th 2d (n,m
) 'layer' 的 3d 数组 X
.
即当前的解决方案是
r = 0
for k in range(K):
r += x[k,:,:] @ (b @ x[k, :, :])
r
能否通过 k
有效计算避免 for 循环?
或者也许还有另一种有效的方法来计算 r
?
(我尝试了 np.tensordot
但由于它只是 k
的纯粹求和,我还没有得到正确的结果。)
这看起来是 einsum 的完美用例:
r = np.einsum('kij,l,klj->i', x, b, x)
这将矢量化操作,例如它比 for 循环更优化。