使用numpy.einsum作为转置时间矩阵:x ^ T * x

时间:2017-09-22 14:44:30

标签: python numpy matrix linear-algebra

对于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; } } 。我在这里错过了什么?为什么它甚至在中间添加一个轴?

1 个答案:

答案 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总和减少,而剩余的轴 - ik保留在输出中。

同样,这将比原生矩阵乘法慢X.T.dot(X)。但是,我猜这篇文章更像是einsum的学习内容。