Python 欧氏距离的矢量化实现
我试图计算欧几里德距离的矢量化实现(X和Y中的每个元素之间使用内积)。数据如下: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 = 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,你是什么意思?@feijaoscipy
有一个函数,可以以矢量化的方式计算两个数组之间的成对欧氏距离。或者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)