我有两个多维 NumPy 数组,A
and B
, with A.shape = (K, d, N)
and B.shape = (K, N, d)
。我想在轴 0 ( K
) 上执行元素操作,该操作是轴 1 和 2 (d, N
和N, d
) 上的矩阵乘法。所以结果应该是一个多维数组C
,C.shape = (K, d, d)
所以C[k] = np.dot(A[k], B[k])
。一个简单的实现应该是这样的:
C = np.vstack([np.dot(A[k], B[k])[np.newaxis, :, :] for k in xrange(K)])
但是这个实现很慢。稍微快一点的方法如下所示:
C = np.dot(A, B)[:, :, 0, :]
np.dot
它使用多维数组的默认行为,给我一个 shape 的数组(K, d, K, d)
。但是,这种方法会计算所需的回答K
时间(沿轴 2 的每个条目都是相同的)。渐近地它会比第一种方法慢,但开销要少得多。我也知道以下方法:
from numpy.core.umath_tests import matrix_multiply
C = matrix_multiply(A, B)
但我不保证此功能可用。因此,我的问题是,NumPy 是否提供了一种有效执行此操作的标准方法?通常适用于多维数组的答案将是完美的,但仅针对这种情况的答案也会很棒。
编辑:正如@Juh_ 所指出的,第二种方法是不正确的。正确的版本是:
C = np.dot(A, B).diagonal(axis1=0, axis2=2).transpose(2, 0, 1)
但是增加的开销使它比第一种方法慢,即使对于小矩阵也是如此。最后一种方法是在我所有的时序测试中以远射获胜,无论是小型矩阵还是大型矩阵。如果没有更好的解决方案出现,我现在强烈考虑使用它,即使这意味着将numpy.core.umath_tests
库(用 C 编写)复制到我的项目中。