29

我是 Numpy 的新手,我想问你如何计算存储在向量中的点之间的欧式距离。

假设我们有一个 numpy.array,每一行都是一个向量和一个 numpy.array。我想知道是否可以计算所有点和这个单点之间的欧几里得距离并将它们存储在一个 numpy.array 中。

这是一个界面:

points #2d list of row-vectors
singlePoint #one row-vector

listOfDistances= procedure( points,singlePoint)

我们能有这样的东西吗?或者是否有可能有一个命令将单点作为其他点的列表,最后我们得到一个距离矩阵?

谢谢

4

5 回答 5

29

要获得距离,您可以在 numpy 中使用 linalg 模块的 norm 方法:

np.linalg.norm(x - y)
于 2016-08-16T13:41:01.003 回答
25

虽然您可以使用矢量化,但 @Karl 的方法对于 numpy 数组会相当慢。

更简单的方法是只做np.hypot(*(points - single_point).T). (转置假设点是 Nx2 数组,而不是 2xN。如果是 2xN,则不需要.T.

然而,这有点不可读,所以你可以像这样更明确地写出来(使用一些罐头示例数据......):

import numpy as np
single_point = [3, 4]
points = np.arange(20).reshape((10,2))

dist = (points - single_point)**2
dist = np.sum(dist, axis=1)
dist = np.sqrt(dist)
于 2010-12-06T21:31:29.537 回答
6
import numpy as np
def distance(v1, v2):
    return np.sqrt(np.sum((v1 - v2) ** 2))    
于 2016-01-26T07:16:15.840 回答
3

要将函数应用于 numpy 数组的每个元素,请尝试numpy.vectorize

为了进行实际计算,我们需要两个向量中的坐标对之间的差异平方和的平方根(哇!)。

我们可以用zip坐标配对,并sum用推导来总结结果。看起来像:

sum((x - y) ** 2 for (x, y) in zip(singlePoint, pointFromArray)) ** 0.5
于 2010-12-06T21:18:05.550 回答
0
import numpy as np
single_point = [3, 4]
points = np.arange(20).reshape((10,2))   
distance = euclid_dist(single_point,points)

def euclid_dist(t1, t2):
    return np.sqrt(((t1-t2)**2).sum(axis = 1))
于 2018-07-23T04:52:08.490 回答