【问题标题】:python - numpy - many matrices multiplying many vectorspython - numpy - 许多矩阵乘以许多向量
【发布时间】:2018-07-17 16:01:13
【问题描述】:

我有一组许多矩阵,每个矩阵对应一个向量。我想巧妙地将每个矩阵乘以其向量。我知道我可以将所有矩阵放在一个大块对角线的形式中,然后乘以一个大的组合向量。

我想知道是否有办法使用numpy.dot 以有效的方式将它们全部相乘。

我尝试使用numpy.stacknumpy.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


【解决方案1】:

你快到了。您需要在第 1 维和第 3 维上添加对角线索引,如下所示:

np.dot(R_stack, p_stack)[np.arange(3),:,np.arange(3),0]

结果中的每一行都将对应于您想要的向量之一:

array([[-3.48805945e-09,  3.48805945e-09],
       [-5.02509157e-09,  5.02509157e-09],
       [-1.48245199e-08,  1.48245199e-08]])

【讨论】:

    【解决方案2】:

    我发现的另一种方法是使用numpy.diagonal

    np.diagonal(np.dot(R_stack, p_stack)[:,:,:,0], axis1=0, axis2=2)
    

    在每一列中给出一个向量:

    array([[0., 0., 0.],
       [0., 0., 0.]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-27
      • 2019-04-16
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 2020-07-18
      相关资源
      最近更新 更多