【问题标题】:How to make dot.product of 2D and 3D matrices (taking it for each dimension separately)如何制作 2D 和 3D 矩阵的点积(每个维度分别取)
【发布时间】:2019-06-26 12:05:34
【问题描述】:

我需要计算两个矩阵的点积。可能 tensordot 会完成这项工作,但是我正在努力找出确切的解决方案。

简单的选择

res = np.dot(x, fullkernel[:, :-1].transpose())

工作正常,其中 x 的形状为 (9999,),fullkernel 的形状为 (980,10000),res 的形状为 (1, 980)。

现在我需要用二维做类似的事情。因此,我的 x 现在具有形状 (9999, 2),fullkernel (2, 980, 10000)。

从字面上看,我希望我的结果“res”是二维的,其中每一个都是一列 x 和一维全内核的点积。

【问题讨论】:

  • res(2, 980)(2, 2, 980) 的具体形状应该是什么?
  • 嗨。感谢您的回复。我已经成功了一点,但还没有。现在我使用解决方案“res = np.dot(x.T, fullkernel[:, :-1, :])”,其中 x (9998,2) 和 fullkernel 是 (2,9999,980),这给了我 res ( 2,2,980),这不是我想要的。因为(2,2.n)表示x的每一列都乘以fullkernel的每一维。我想得到形状 (2,1,980) 的 res,所以 x 的第一列乘以全内核的第一维,第二列乘以第二。

标签: python numpy matrix dot-product


【解决方案1】:

你可以这样做:

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)

【讨论】:

  • 完美。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多