【问题标题】:Vectorized implementation for Euclidean distance [duplicate]欧几里得距离的矢量化实现
【发布时间】:2018-11-13 01:21:05
【问题描述】:

我正在尝试计算欧几里德距离的矢量化实现(在 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 个元素。

有谁知道我做错了什么?

【问题讨论】:

  • scipy.spatial.distance_matrix?
  • @YakymPirozhenko,你是什么意思?
  • @feijao scipy 具有以矢量化方式计算两个数组之间的成对欧几里得距离的函数。

标签: python numpy vectorization euclidean-distance


【解决方案1】:

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

np.linalg.norm(X - Y, axis=1)

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

np.sqrt(np.einsum('ij,ij->i...', X - Y, X - Y))

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

from scipy.spatial.distance import cdist

cdist(X, Y)

【讨论】:

  • np.sqrt(np.einsum('ij,ij->i...', *2*(X - Y,))) 这样您就不会计算X-Y 两次。
  • 另外,np.sqrt(ne.evaluate("(X - Y) ** 2").sum(1)) 使用numexpr 似乎更快。
  • @PaulPanzer 不错的把戏,不知道。虽然语法有点晦涩,解释器不应该在那里做某种缓存吗?
  • 大多数时候只创建一个中间D = X-Y; np.sqrt ... 会更简单,但这个技巧对于lambdas 和一个衬垫很有用。重新缓存我不确定X-Y 是否官方保证总是返回相同的答案,或者没有副作用,所以我不知道解释器是否可以依赖它。
  • 哇。你们太棒了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 2016-02-18
  • 2016-08-06
  • 2013-03-02
  • 2016-04-09
  • 2015-07-15
相关资源
最近更新 更多