Python 欧氏距离的矢量化实现

Python 欧氏距离的矢量化实现,python,numpy,vectorization,euclidean-distance,Python,Numpy,Vectorization,Euclidean Distance,我试图计算欧几里德距离的矢量化实现(X和Y中的每个元素之间使用内积)。数据如下: X = np.random.uniform(low=0, high=1, size=(10000, 5)) Y = np.random.uniform(low=0, high=1, size=(10000, 5)) 我所做的是: euclidean_distances_vectorized = np.array(np.sqrt(np.sum(X**2, axis=1) - 2 * np.dot(X, Y.T) +

我试图计算欧几里德距离的矢量化实现(X和Y中的每个元素之间使用内积)。数据如下:

X = np.random.uniform(low=0, high=1, size=(10000, 5))
Y = np.random.uniform(low=0, high=1, size=(10000, 5))
我所做的是:

euclidean_distances_vectorized = np.array(np.sqrt(np.sum(X**2, axis=1) - 2 * np.dot(X, Y.T) + np.sum(Y**2, axis=1)))
虽然这提供了“一些输出”,但答案是错误的,因为每行仍然包含5个元素


有人知道我做错了什么吗?

如果我理解正确,应该这样做

np.linalg.norm(X - Y, axis=1)
或使用
einsum
(沿第一轴的每个差分对的点积的平方根)

如果你想要所有成对的距离

from scipy.spatial.distance import cdist

cdist(X, Y)

scipy.spatial.distance\u matrix
?@YakymPirozhenko,你是什么意思?@feijao
scipy
有一个函数,可以以矢量化的方式计算两个数组之间的成对欧氏距离。或者
np.sqrt(np.einsum('ij,ij->i.,*2*(X-Y,))
所以你不需要计算
X-Y
两次。另外,
np.sqrt(ne.evaluate)(“(X-Y)**2“.总和(1))
使用
numexpr
@PaulPanzer的技巧似乎更快,但我不知道。虽然语法有点晦涩,解释器不应该在那里进行某种缓存吗?大多数时候,只需创建一个中间
D=X-Y;np.sqrt…
就可以了,但这个技巧对于
lambda
和一行程序很有用。你是缓存我不确定
X-Y
是否正式保证总是返回相同的答案,或者没有副作用,所以我不知道解释器是否可以信赖。哇,你们太棒了。谢谢。
from scipy.spatial.distance import cdist

cdist(X, Y)