numpy einsum:3D 矩阵和 2D 矩阵之间的元素乘积

问题描述

我有两个 numy 矩阵:

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

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

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

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

我对 einsum 的使用是否正确?

解决方法

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

您尝试执行的操作是在轴 = 1 of A(M 尺寸)上的广播元素明智乘积 -

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

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

A = np.random.randint(0,5,(2,3,1)) # N,d
B = np.random.randint(0,(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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...