首页 > 解决方案 > numpy einsum:3D 矩阵和 2D 矩阵之间的元素乘积

问题描述

我有两个 numy 矩阵:

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

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

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

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

我对 einsum 的使用是否正确?

标签: pythonnumpynumpy-einsum

解决方案


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

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

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工作的细节可以在这里找到。


推荐阅读