我试图找出一种方法来使用 numpy 以最省时的方式执行以下代数:
给定一个具有形状的 3D 矩阵/张量和一个具有A
形状(n, m, p)
的 2D 矩阵/张量,计算,其中生成的矩阵将具有维度 (n, m)。B
(n, p)
C_ij = sum_over_k (A_ijk * B_ik)
C
我尝试了两种方法来做到这一点。一种是循环遍历第一个维度,每次计算一个正则点积。另一种方法是使用np.tensordot(A, B.T)
shape 计算结果(n, m, n)
,然后沿第 1 维和第 3 维取对角线元素。两种方法如下所示。
第一种方法:
C = np.zeros((n,m))
for i in range(n):
C[i] = np.dot(A[i], B[i])
第二种方法:
C = np.diagonal(np.tensordot(A, B.T, axes = 1), axis1=0, axis2=2).T
但是,因为 n 是一个非常大的数字,所以第一种方法中的 n 循环会花费大量时间。第二种方法计算了太多不必要的条目来获得那个巨大的(n, m, n)
矩阵,并且也花费了太多时间,我想知道是否有任何有效的方法可以做到这一点?