2012-11-27 47 views
3

我已描述了一个多段线(连接的直线段的排序列表)如下的数组:计算阵列的连续点之间的欧氏距离与numpy的

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提供EVERY距离,我想只有相邻行之间的距离。另外,我宁愿避免创建自定义函数(因为我已经有一个工作解决方案),而是使用更多的“numpythonic”使用本机函数。

回答

7

这里有一种方法:

使用矢量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)) 
+0

经过我自己的一些死路,当你这样说时,它实际上是非常简单的。我曾经看到过'hypot'这个词,但是谷歌搜索“numpy hypot”并没有返回任何内容,我不得不在numpy docs页面上进行搜索。谢谢! – heltonbiker

+0

在3D中这也是可能的吗? – Varlor

+0

@Varlor:不是用'hypot',而是第二个版本,'segdists = np.sqrt((d ** 2).sum(axis = 1))'在3D中工作。 –