Numpy 计算 3D 矩阵内部数组的点积
Numpy compute dot product of the inner array of a 3D matrix
我有两个数组,如下所示:
在代码中是:
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)
这是可以预料的,但我想规避它。
由于您将所有行的 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
我使用 np.einsum
:
np.einsum("...i, ...i", t, t)
它产生与我的 for 循环相同的输出。
我有两个数组,如下所示:
在代码中是:
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)
这是可以预料的,但我想规避它。
由于您将所有行的 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
我使用 np.einsum
:
np.einsum("...i, ...i", t, t)
它产生与我的 for 循环相同的输出。