【问题标题】:Numpy compute dot product of the inner array of a 3D matrix [duplicate]3D矩阵内部数组的Numpy计算点积[重复]
【发布时间】:2020-06-02 09:50:34
【问题描述】:

我有两个数组,如下所示:

在代码中:

t = np.random.rand(6, 6, 2)

我现在想为轴 0 和轴 1 数组的每个条目计算轴 2 数组(形状为 2 的数组)的点积。

我可以用 for 循环来做到这一点:

Q = np.zeros_like(t)
for i in range(6):
    for j in range(6):
        Q[i,j] = t[i,j].dot(t[i,j])

如何使用 numpy 函数做到这一点?

我无法让它与.dot.tensordot 或类似方法一起使用...

t.dot(t) 会产生此错误ValueError: shapes (6,6,2) and (6,6,2) not aligned: 2 (dim 2) != 6 (dim 1),这是意料之中的,但我想规避它。

【问题讨论】:

    标签: python numpy matrix-multiplication dot-product numpy-einsum


    【解决方案1】:

    由于您将所有行的 dot 乘积与自身相乘,因此您可以简化为 t 与自身的乘积并将结果相加。为了和t有相同的形状,可以使用np.broadcast_to

    np.broadcast_to((t*t).sum(-1)[...,None], t.shape)
    

    更新

    根据 cmets,您似乎只需要:

    (t*t).sum(-1)
    

    检查:

    np.allclose(Q, np.broadcast_to((t*t).sum(-1)[...,None], t.shape))
    # True
    

    【讨论】:

    • 感谢您的回答,但是在我看来,我使用了一种更简单的方法。给您带来的不便深表歉意。
    • 您的方法产生的结果与Q 不同,我认为这是预期的输出。这意味着我的答案可以简化为(t*t).sum(-1),这似乎是一种非常简单的方法IMO @charel-f
    • 哦,我明白了,我一定搞砸了我的数组,因为我在做练习时使用了一个不同的数组,然后是那个用来问我问题的数组。对不起
    【解决方案2】:

    我得到了它与np.einsum

    np.einsum("...i, ...i", t, t)
    

    它产生与我的 for 循环相同的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 2022-01-13
      • 2015-03-31
      • 2014-11-10
      • 1970-01-01
      相关资源
      最近更新 更多