我可以为 x_i 做 (x_i-x_j)^T(x_i-x_j) 吗,x_j 是 X 矩阵中的行,具有 numpy 本机函数而不是循环

Can I do (x_i-x_j)^T(x_i-x_j) for x_i, x_j are rows in a X matrix with numpy native function instead of loop

我需要在 numpy 中计算 ,其中 $x_i$ 和 $x_j$ 是矩阵 $X$ 中的行。现在我正在使用循环,它非常慢。是否有任何 numpy 本机函数允许这样的计算,例如 einsum:

n=X.shape[0]
Y=np.zeros((n,n))
for i in range(n):
    x=(X-X[i])**2
    x=np.sum(x, axis=1)
    Y[i]=x
return Y

顺便说一句,我对 einsum 很困惑。有没有什么好的material介绍一下。 numpy 的手册页对我来说不是很清楚。

方法 #1

您可以使用 broadcasting 作为 vectorized 方法 -

import numpy as np
Y = np.sum((X - X[:,None,:])**2,2)

对于相对较小的输入数组,这应该是有效的。


方法 #2

您似乎在执行欧几里得距离计算并获得平方距离。所以,你可以像这样使用 distance.cdist -

import numpy as np
from scipy.spatial import distance
Y = distance.cdist(X, X, 'sqeuclidean')

这对于大型输入数组应该很有效。