优雅的 Numpy 张量产品
Elegant Numpy Tensor product
我需要在 numpy(或 pytorch)中对两个张量进行乘积:
我有
A = np.arange(1024).reshape(8,1,128)
B = np.arange(9216).reshape(8, 128, 9)
并希望获得 C
,点积求和 A
的最后一个 dim (axis=2
) 和 B
的中间 dim (axis=1
).这应该有尺寸 8x9
。目前,我正在做:
C = np.zeros([8, 9])
for i in range(8):
C[i,:] = np.matmul(A[i,:,:], B[i,:,:])
如何优雅地做到这一点?
我试过了:
np.tensordot(weights, features, axes=(2,1)).
但是 returns 8x1x8x9
.
一种方法是使用 numpy.einsum
.
C = np.einsum('ijk,ikl->il', A, B)
或者您可以使用 broadcasted 矩阵乘法。
C = (A @ B).squeeze(axis=1)
# equivalent: C = np.matmul(A, B).squeeze(axis=1)
我需要在 numpy(或 pytorch)中对两个张量进行乘积:
我有
A = np.arange(1024).reshape(8,1,128)
B = np.arange(9216).reshape(8, 128, 9)
并希望获得 C
,点积求和 A
的最后一个 dim (axis=2
) 和 B
的中间 dim (axis=1
).这应该有尺寸 8x9
。目前,我正在做:
C = np.zeros([8, 9])
for i in range(8):
C[i,:] = np.matmul(A[i,:,:], B[i,:,:])
如何优雅地做到这一点?
我试过了:
np.tensordot(weights, features, axes=(2,1)).
但是 returns 8x1x8x9
.
一种方法是使用 numpy.einsum
.
C = np.einsum('ijk,ikl->il', A, B)
或者您可以使用 broadcasted 矩阵乘法。
C = (A @ B).squeeze(axis=1)
# equivalent: C = np.matmul(A, B).squeeze(axis=1)