2012-11-27 121 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中工作。 –

相關問題