3D矩阵内部数组的Numpy计算点积

时间:2020-06-02 09:50:34

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

我有两个看起来如下的数组:

enter image description here

代码为:

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),这是可以预期的,但是我想绕过它。

2 个答案:

答案 0 :(得分:0)

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

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

更新

根据评论,您似乎只需要:

(t*t).sum(-1)

检查:

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

答案 1 :(得分:0)

我可以和np.einsum一起使用:

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

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