【问题标题】:numpy einsum: Elementwise product between 3D matrix and 2D matrixnumpy einsum:3D 矩阵和 2D 矩阵之间的元素乘积
【发布时间】:2021-04-10 01:24:15
【问题描述】:

我有两个 numy 矩阵:

  1. 形状为 (N,M,d) 的 A
  2. 形状为 (N,d) 的 B

所以,我试图以这样的方式获得一个形状为 (N,M,d) 的矩阵,以便在 B 和 A 的每个元素(它们是 M 个元素)之间进行元素明智的乘积。我使用 numpy 的 einsum 如下:

product = np.einsum('ijk,ik->ijk', A, B) 

我得到了良好的形状,但我怀疑操作是错误的,并且我没有按预期做元素明智的产品。

我对 einsum 的使用正确吗?

【问题讨论】:

  • 你可以用一对玩具矩阵在大约 2 秒内进行测试。投票结束,因为您没有查看数据。
  • 另外,如果您不确定,请使用A * B[:, None, :]
  • @MadPhysicist,同时对我的答案进行了同样的编辑。

标签: python numpy numpy-einsum


【解决方案1】:

我试图以这样的方式获得一个形状为 (N,M,d) 的矩阵,以便在 B 和 A 的每个元素(即 M 个元素)之间进行元素乘积。

您尝试执行的操作是在axis = 1 of A(M 大小)上的广播元素明智产品-

C1 = A * B[:,None,:]

您始终可以进行快速测试,以检查您所期望的结果是否确实是您已实施的结果。

A = np.random.randint(0,5,(2,3,1)) # N,M,d
B = np.random.randint(0,5,(1,1))   # N,d

C2 = np.einsum('ijk,ik->ijk', A, B)
print(C2)
[[[4]
  [0]
  [8]]

 [[4]
  [4]
  [4]]]

再次检查两个操作是否相等=

np.allclose(C1, C2)

##True

有关np.einsum 工作原理的更多详细信息,请访问here

【讨论】:

  • 好的!谢谢 !我正在实现一个算法,但结果有点偏离,所以我怀疑这个操作。但是,如果 einsum 进行某种求和,则 B 具有形状 (1,1) 的事实可能不那么具有代表性。我将使用形状 (2,2) 进行测试
  • 顺便说一句,你不需要在这里使用 np.einsum。我已更新我的答案以使用直截了当的广播。
  • 如果对您有帮助,请标记答案,如果您喜欢,请点赞。这鼓励我帮助解决您未来的问题:)
  • 一切都好,在此之前您需要一些声誉:) 如果它解决了您的问题,请随时将答案标记为正确。您可以通过单击答案的upvote 和downvote 按钮正下方的勾号来做到这一点。
  • 你有我的支持。您通常应该使用 array_equals 检查整数运算,而不是 allclose
猜你喜欢
  • 1970-01-01
  • 2016-05-11
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
相关资源
最近更新 更多