6

次のように、ポリライン (接続された直線セグメントの順序付きリスト) を記述する配列があります。

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」に使用します。

4

1 に答える 1

14

1 つの方法を次に示します。

ベクトル化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))
于 2012-11-27T20:11:42.480 に答える