对于2D矩阵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)
论证。
这不适用于错误(对于ValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (4,3)->(4,newaxis,3) (4,3)->(3,4)
):
np.einsum('ij,jk->ik', X.T, X)
但这可行:void foo(int *p, int n) {
for (int i = 0; i <= n ; i++) {
p[i] = i/4;
}
}
。我在这里错过了什么?为什么它甚至在中间添加一个轴?
答案 0 :(得分:4)
使用X.T * X
(*为矩阵乘法),您将第一个X's transpose
的第二个轴与第二个X
的第一个轴相减。现在,第一个X's transpose
的第二个轴与第一个X
的第一个轴相同。因此,我们简单地将第一个轴与这两个X's
相减,而其余的轴保持不变。
要在einsum
上复制它,保持字符串符号中的第一个字符相同,而两个输入的第二个轴不同,如下所示 -
np.einsum('ji,jk->ik', X, X)
因此,j's
总和减少,而剩余的轴 - i
和k
保留在输出中。
同样,这将比原生矩阵乘法慢X.T.dot(X)
。但是,我猜这篇文章更像是einsum
的学习内容。