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

时间:2015-04-30 14:49:30

标签: python performance numpy matrix vectorization

我需要在numpy中计算(x_i-x_j)^T(x_i-x_j),其中$ 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非常困惑。它的引入是否有任何好的材料。关于numpy的手册页对我来说不是很清楚。

1 个答案:

答案 0 :(得分:2)

方法#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')

对于大型输入数组,这应该是有效的。