使用 numpy.einsum 转置时间矩阵:x^T * x
Using numpy.einsum for transpose times matrix: x^T * x
对于二维矩阵 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)
。我在这里错过了什么?为什么它还要在中间添加一个轴?
使用 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)
。但是,我猜这个 post 更像是 einsum
.
的学习对象
对于二维矩阵 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)
。我在这里错过了什么?为什么它还要在中间添加一个轴?
使用 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)
。但是,我猜这个 post 更像是 einsum
.