我可以为 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')
这对于大型输入数组应该很有效。
我需要在 numpy 中计算
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')
这对于大型输入数组应该很有效。