2D 和 3D numpy 数组之间的点积
Dot product between 2D and 3D numpy arrays
我有 2 个数组 x
和 y
,形状分别为 (2, 3, 3)
,(3, 3)
。我想通过以下方式计算形状 (2, 3)
的点积 z
:
x = np.array([[[a111, a121, a131], [a211, a221, a231], [a311, a321, a331]],
[[a112, a122, a132], [a212, a222, a232], [a312, a322, a332]]])
y = np.array([[b11, b12, b13], [b21, b22, b23], [b31, b32, b33]])
z = np.array([[a111*b11+a121*b12+a131*b13, a211*b21+a221*b22+a231*b23, a311*b31+a321*b32+a331*b33],
[a112*b11+a122*b12+a132*b13, a212*b21+a222*b22+a232*b23, a312*b31+a322*b32+a332*b33]])
关于如何以矢量化方式执行此操作的任何想法?
关于问题中显示的总和减少,似乎减少是沿着最后一个轴,同时保持 x
的第二个轴与 y
的第一个轴对齐。由于轴对齐的要求,我们可以使用 np.einsum
。因此,一个向量化的解决方案是 -
np.einsum('ijk,jk->ij',x, y)
样本运行-
In [255]: x
Out[255]:
array([[[5, 1, 7],
[2, 1, 7],
[5, 1, 2]],
[[6, 4, 7],
[3, 8, 1],
[1, 7, 7]]])
In [256]: y
Out[256]:
array([[5, 4, 7],
[8, 2, 5],
[2, 3, 3]])
In [260]: np.einsum('ijk,jk->ij',x, y)
Out[260]:
array([[78, 53, 19],
[95, 45, 44]])
In [261]: 5*5 + 1*4 + 7*7
Out[261]: 78
In [262]: 2*8 + 1*2 + 7*5
Out[262]: 53
我有 2 个数组 x
和 y
,形状分别为 (2, 3, 3)
,(3, 3)
。我想通过以下方式计算形状 (2, 3)
的点积 z
:
x = np.array([[[a111, a121, a131], [a211, a221, a231], [a311, a321, a331]],
[[a112, a122, a132], [a212, a222, a232], [a312, a322, a332]]])
y = np.array([[b11, b12, b13], [b21, b22, b23], [b31, b32, b33]])
z = np.array([[a111*b11+a121*b12+a131*b13, a211*b21+a221*b22+a231*b23, a311*b31+a321*b32+a331*b33],
[a112*b11+a122*b12+a132*b13, a212*b21+a222*b22+a232*b23, a312*b31+a322*b32+a332*b33]])
关于如何以矢量化方式执行此操作的任何想法?
关于问题中显示的总和减少,似乎减少是沿着最后一个轴,同时保持 x
的第二个轴与 y
的第一个轴对齐。由于轴对齐的要求,我们可以使用 np.einsum
。因此,一个向量化的解决方案是 -
np.einsum('ijk,jk->ij',x, y)
样本运行-
In [255]: x
Out[255]:
array([[[5, 1, 7],
[2, 1, 7],
[5, 1, 2]],
[[6, 4, 7],
[3, 8, 1],
[1, 7, 7]]])
In [256]: y
Out[256]:
array([[5, 4, 7],
[8, 2, 5],
[2, 3, 3]])
In [260]: np.einsum('ijk,jk->ij',x, y)
Out[260]:
array([[78, 53, 19],
[95, 45, 44]])
In [261]: 5*5 + 1*4 + 7*7
Out[261]: 78
In [262]: 2*8 + 1*2 + 7*5
Out[262]: 53