【问题标题】:Euclidean Distance Between All Points in an 2 Vectors2个向量中所有点之间的欧几里得距离
【发布时间】:2016-03-05 08:10:22
【问题描述】:

如果我有两个长度为 M 和 N 的一维数组,计算所有点之间的欧几里德距离的最有效方法是什么,结果是 NxM 数组?我正在尝试用 Numpy 解决这个问题,但我对它很陌生,所以我有点卡住了。

目前我正在这样做:

def get_distances(x,y):
    #compute distances between all points
    distances = np.zeros((len(y),len(x)))
    for i in range(len(y)):
        for j in range(len(x)):
            distances[i,j] = (x[j] - y[i])**2
    return distances

【问题讨论】:

  • 当你说你的数组每个“代表空间中的一条线”时,你到底是什么意思?它们是沿某个轴还是其他距离?
  • 其实我说错了,它们实际上是空间线的 y 值。我会纠正的。

标签: python python-2.7 numpy


【解决方案1】:

假设你有一维位置:

a = np.random.uniform(50,200,5)
b = np.random.uniform(50,200,3)

你可以只使用广播:

result = np.abs(a[:, None] - b[None, :])

结果是:

array([[ 44.37361012,  22.20152487,  89.04608885],
       [ 42.83825434,  20.66616909,  87.51073307],
       [  0.19806059,  21.97402467,  44.87053932],
       [  8.42276237,  13.74932288,  53.0952411 ],
       [  8.12181467,  30.29389993,  36.55066406]])

所以 i, j 索引是数组 1 的点 i 和数组 2 的点 j 之间的距离

如果您希望结果为 NxM 形状,则需要交换 ab

result = np.abs(b[:, None] - a[None, :])

【讨论】:

  • 感谢您的回复。当我尝试您的方法时,我得到了不同的结果,然后我认为这是一种效率较低的方法。我已经包含了我的代码进行比较。这是 vs:距离 = np.abs(x[:,None] - y[None,:])
  • 我想你忘了你必须在平方差后取平方根。但由于它是一维的,所以绝对值要快得多,而且完全等价。
  • @chemnteach - 也许我混淆了你想要的形状。如果您想要 N x M 结果形状,我已经编辑了答案。我反过来读了。但它只是交换ab
  • 我的问题是我切换了a和b。非常感谢您的帮助!
猜你喜欢
  • 2016-04-09
  • 2011-01-29
  • 2014-05-31
  • 2019-07-10
  • 2014-11-12
  • 1970-01-01
  • 2021-02-11
  • 2014-06-14
  • 2014-03-27
相关资源
最近更新 更多