如何制作 2D 和 3D 矩阵的 dot.product(分别为每个维度取)
How to make dot.product of 2D and 3D matrices (taking it for each dimension separately)
我需要计算两个矩阵的点积。 tensordot 可能会完成这项工作,但我正在努力找出确切的解决方案。
简单选项
res = np.dot(x, fullkernel[:, :-1].transpose())
工作正常,其中 x 的形状为 (9999,),fullkernel 的形状为 (980,10000),res 的形状为 (1, 980)。
现在我需要用二维做类似的事情。因此,我的 x 现在具有形状 (9999, 2),完整内核 (2, 980, 10000)。
从字面上看,我希望我的结果 "res" 是二维的,其中每个都是 dot.product x 的一列和 fullkernel 的一维。
你可以这样做:
res = np.einsum('ki,ijk->ij', x, fullkernel[:, :, :-1])
print(res.shape)
# (2, 980)
如果你想在中间添加额外的单例维度,只需执行以下操作:
res = np.expand_dims(res, 1)
@
/ np.matmul
的等效解决方案是:
res = np.expand_dims(x.T, 1) @ np.moveaxis(fullkernel[:, :, :-1], 2, 1)
print(res.shape)
# (2, 1, 980)
我需要计算两个矩阵的点积。 tensordot 可能会完成这项工作,但我正在努力找出确切的解决方案。
简单选项
res = np.dot(x, fullkernel[:, :-1].transpose())
工作正常,其中 x 的形状为 (9999,),fullkernel 的形状为 (980,10000),res 的形状为 (1, 980)。
现在我需要用二维做类似的事情。因此,我的 x 现在具有形状 (9999, 2),完整内核 (2, 980, 10000)。
从字面上看,我希望我的结果 "res" 是二维的,其中每个都是 dot.product x 的一列和 fullkernel 的一维。
你可以这样做:
res = np.einsum('ki,ijk->ij', x, fullkernel[:, :, :-1])
print(res.shape)
# (2, 980)
如果你想在中间添加额外的单例维度,只需执行以下操作:
res = np.expand_dims(res, 1)
@
/ np.matmul
的等效解决方案是:
res = np.expand_dims(x.T, 1) @ np.moveaxis(fullkernel[:, :, :-1], 2, 1)
print(res.shape)
# (2, 1, 980)