【发布时间】:2020-01-09 19:41:57
【问题描述】:
我正在尝试找出一种方法来使用 numpy 以最省时的方式执行以下代数:
给定一个形状为(n, m, p) 的3D 矩阵/张量A 和一个形状为(n, p) 的2D 矩阵/张量B,计算C_ij = sum_over_k (A_ijk * B_ik),其中生成的矩阵C 将具有尺寸(n,m)。
我尝试了两种方法来做到这一点。一种是循环遍历第一个维度,每次计算一个正则点积。
另一种方法是使用np.tensordot(A, B.T) 计算形状为(n, m, n) 的结果,然后沿第一维和第三维取对角线元素。两种方法如下所示。
第一种方法:
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)matrix,而且也花费了太多的时间,我想知道是否有任何有效的方法可以做到这一点?
【问题讨论】:
标签: python numpy linear-algebra tensordot