4

目前我使用

Na = (3, 2, 4)
Nb = Na[1:]
A = np.arange(np.prod(Na)).reshape(Na)
b = np.arange(np.prod(Nb)).reshape(Nb)

我想计算:

r_ik = sum_j(A_ijk * b_jk)

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 是“4 个矩阵的堆栈”(形状为 (3,2)),即 3d 数组,b 是“4 个向量的堆栈”(形状为 (3,)),即 2d 数组。期望的结果是“4 个矩阵向量积的堆栈”,即向量堆栈,即再次是二维数组(形状为 (3, 4))。

我对 np.einsum 和 np.tensordot 进行了中等深度的研究,但我用它们构建的任何解决方案至少与我的循环解决方案一样长且可读性差。

但是我认为应该有一个简单的问题来解决这个问题。

4

1 回答 1

6

我不知道为什么np.einsum不适合你。这应该可以解决问题:

r = np.einsum('ijk,jk->ik', A, b)

我认为这非常易读,因为它完全反映了您在问题中给出的数学公式。

于 2017-08-01T14:50:16.760 回答