张量的 numpy 点积(3d 乘以 2d)
numpy dot product for tensors (3d times 2d)
目前我在用
Na = (3, 2, 4)
Nb = Na[1:]
A = np.arange(np.prod(Na)).reshape(Na)
b = np.arange(np.prod(Nb)).reshape(Nb)
我要计算:
r = np.empty((A.shape[0], A.shape[2])
for i in range(A.shape[2]):
r[:, i] = np.dot(A[:, :, i], b[:, i])
换句话说:A是一个"stack of 4 matrices"(形状为(3,2)),即一个3d数组,b是一个"stack of 4 vectors"(形状为(3,)),即一个2d -大批。期望的结果是 "stack of 4 matrix-vector-products",即一堆向量,即再次是二维数组(形状为 (3, 4))。
我对 np.einsum 和 np.tensordot 进行了中等深度的研究,但我用它们构建的任何解决方案至少与我的循环解决方案一样长且可读性差。
不过我认为这个简单的问题应该有一条直线。
我不确定为什么 np.einsum
对您不起作用。这 应该 达到目的:
r = np.einsum('ijk,jk->ik', A, b)
我认为这非常可读,因为它准确地反映了您在问题中给出的数学公式。
目前我在用
Na = (3, 2, 4)
Nb = Na[1:]
A = np.arange(np.prod(Na)).reshape(Na)
b = np.arange(np.prod(Nb)).reshape(Nb)
我要计算:
r = np.empty((A.shape[0], A.shape[2])
for i in range(A.shape[2]):
r[:, i] = np.dot(A[:, :, i], b[:, i])
换句话说:A是一个"stack of 4 matrices"(形状为(3,2)),即一个3d数组,b是一个"stack of 4 vectors"(形状为(3,)),即一个2d -大批。期望的结果是 "stack of 4 matrix-vector-products",即一堆向量,即再次是二维数组(形状为 (3, 4))。
我对 np.einsum 和 np.tensordot 进行了中等深度的研究,但我用它们构建的任何解决方案至少与我的循环解决方案一样长且可读性差。
不过我认为这个简单的问题应该有一条直线。
我不确定为什么 np.einsum
对您不起作用。这 应该 达到目的:
r = np.einsum('ijk,jk->ik', A, b)
我认为这非常可读,因为它准确地反映了您在问题中给出的数学公式。