【发布时间】:2018-07-17 16:01:13
【问题描述】:
我有一组许多矩阵,每个矩阵对应一个向量。我想巧妙地将每个矩阵乘以其向量。我知道我可以将所有矩阵放在一个大块对角线的形式中,然后乘以一个大的组合向量。
我想知道是否有办法使用numpy.dot 以有效的方式将它们全部相乘。
我尝试使用numpy.stack 和numpy.dot,但我不能只得到想要的向量。
更具体一点。我的矩阵看起来像:
R_stack = np.stack((R, R2, R3))
这是
array([[[-0.60653066, 1.64872127],
[ 0.60653066, -1.64872127]],
[[-0.36787944, 2.71828183],
[ 0.36787944, -2.71828183]],
[[-0.22313016, 4.48168907],
[ 0.22313016, -4.48168907]]])
我的向量看起来像:
p_stack = np.stack((p0, p0_2, p0_3))
这是
array([[[0.73105858],
[0.26894142]],
[[0.88079708],
[0.11920292]],
[[0.95257413],
[0.04742587]]])
我想乘以:R*p0, R2*p0_2, R3*p0_3。
当我执行dot 时:
np.dot(R_stack, p_stack)[:,:,:,0]
我明白了
array([[[ 0. , -0.33769804, -0.49957337],
[ 0. , 0.33769804, 0.49957337]],
[[ 0.46211716, 0. , -0.22151555],
[-0.46211716, 0. , 0.22151555]],
[[ 1.04219061, 0.33769804, 0. ],
[-1.04219061, -0.33769804, 0. ]]])
我感兴趣的 3 个向量是对角线上的 3 个 [0,0] 向量。我怎样才能得到它们?
【问题讨论】:
-
更多细节......就像一个工作示例 + 你的尝试。
-
你试过什么(请贴出代码)?你能给我们一些输入和预期输出的例子吗?什么没有按预期工作?
-
@Mathieu 只是举个例子。我在包含我的示例之前不小心发布了。
-
如果您使用
dot并提取对角线,则需要进行大量额外计算。einsum可以只做需要的计算。matmul也可以使用 - 可能带有附加维度。 -
(R_stack @ p_stack)[:,:,0]更快。或者在einsum(如果可能的话现在短路到@),np.einsum('ijk,ikl->ijl', R_stack, p_stack)[:,:,0]
标签: python numpy matrix-multiplication