欧几里得距离的矢量化实现

tav*_*ndo 4 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))
Run Code Online (Sandbox Code Playgroud)

我所做的是:

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)))
Run Code Online (Sandbox Code Playgroud)

尽管这给出了“一些输出”,但答案是错误的,因为每行仍然包含 5 个元素。

有谁知道我做错了什么?

fil*_*ppo 5

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

np.linalg.norm(X - Y, axis=1)
Run Code Online (Sandbox Code Playgroud)

或与einsum(沿第一个轴的每个差异对的点积的平方根)

np.sqrt(np.einsum('ij,ij->i...', X - Y, X - Y))
Run Code Online (Sandbox Code Playgroud)

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

from scipy.spatial.distance import cdist

cdist(X, Y)
Run Code Online (Sandbox Code Playgroud)

  • 或者 `np.sqrt(np.einsum('ij,ij->i...', *2*(X - Y,)))` 这样你就不用计算两次 `XY`。 (3认同)
  • 此外,`np.sqrt(ne.evaluate("(X - Y) ** 2").sum(1))` 似乎用 `numexpr` 更快。 (2认同)