对于二维矩阵 X (形状 (m,n) ),我正在尝试计算 X.T * X,其中 * 是矩阵乘法。 Following the explanation on this post 我希望能够使用 np.einsum('ji,ik->jk', X, X) 来做到这一点,其中在 LHS 上编写 ji 首先采用第一个 X 参数的转置,然后将其乘以第二个 X 参数。

这不适用于错误(对于 (m,n) = (3,4) ):



然而,这有效: np.einsum('ij,jk->ik', X.T, X) 。我在这里缺少什么?为什么它甚至在中间添加一个轴?

最佳答案

使用 X.T * X (* 是矩阵乘法),您将第一个 X's transpose 的第二个轴与第二个 X 的第一个轴相减。现在,第一个 X's transpose 的第二个轴将与第一个 X 的第一个轴相同。因此,我们只是对这两个 X's 的第一个轴进行求和,而其余的轴保持不变。

要在 einsum 上复制它,请保持字符串符号中的第一个字符相同,而两个输入的第二个轴的不同,如下所示 -

np.einsum('ji,jk->ik', X, X)

因此,j's 是 sum-reduced,而其余的轴 - ik 保留在输出中。

同样,这将比本地矩阵乘法慢: X.T.dot(X) 。但是,我猜这篇文章更像是对 einsum 的学习。

关于python - 使用 numpy.einsum 进行转置时间矩阵 : x^T * x,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46367441/

10-12 02:13