我有两个看起来如下的数组:
代码为:
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])
我无法使其与.dot
,.tensordot
或类似方法一起使用...
t.dot(t)
产生此错误ValueError: shapes (6,6,2) and (6,6,2) not aligned: 2 (dim 2) != 6 (dim 1)
,这是可以预期的,但是我想绕过它。
答案 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循环相同的输出。