使用numpy计算数组中相邻点之间的欧几里得距离

7

我有一个数组,描述了一条折线(连接的直线段有序列表),如下所示:

points = ((0,0),
          (1,2),
          (3,4),
          (6,5),
          (10,3),
          (15,4))
points = numpy.array(points, dtype=float)

目前,我使用以下循环获取线段距离列表:

segdists = []
for seg in xrange(points.shape[0]-1):
    seg = numpy.diff(points[seg:seg+2], axis=0)
    segdists.append(numpy.linalg.norm(seg))

我希望能够使用一次函数调用而不是循环,使用一些本地的Scipy/Numpy函数,以下是最接近的代码:
from scipy.spatial.distance import pdist
segdists = pdist(points, metric='euclidean')

但是在后一种情况下,segdists提供了每个距离,我只想得到相邻行之间的距离。

此外,我更愿意避免创建自定义函数(因为我已经有了一个可行的解决方案),而是使用更多“numpythonic”方式的本地函数。

1个回答

15

这里有一种方法:

使用向量化的np.diff来计算增量:

d = np.diff(points, axis=0)

然后使用np.hypot来计算长度:
segdists = np.hypot(d[:,0], d[:,1])

或者使用更明确的计算方式:

segdists = np.sqrt((d ** 2).sum(axis=1))

在我自己尝试了一些死胡同之后,当你这样说的时候,它实际上非常简单。我以前见过 hypot 被提到过,但是谷歌搜索“numpy hypot”没有返回任何结果,我不得不在 numpy 文档页面上搜索。谢谢! - heltonbiker
这在3D中也可能吗? - Varlor
@Varlor:不是用hypot,而是第二个版本,segdists = np.sqrt((d ** 2).sum(axis=1)),适用于3D。 - Warren Weckesser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接