1

GPS 軌跡を表す地理座標のリストから作成された配列を使用しています。データは次のようになります。

[[-51.203018 -29.996149]
 [-51.203018 -29.99625 ]
 [-51.20266  -29.996229]
 ..., 
 [-51.64315  -29.717896]
 [-51.643112 -29.717737]
 [-51.642937 -29.717709]]

行間の地理的距離を計算したい (開始点で最初の要素が常にゼロであるという特別な条件で)。これにより、距離のリストlen(distances) == coord_array.shape[1]、または同じ配列の 3 番目の列のいずれかが得られます。

2 つの点 (2 つの座標ペア) 間の距離を返す関数を既に持っていることに注意することが重要ですが、行ペアをループする代わりに、単一の配列操作でそれを適用する方法がわかりません。

現在、1 つの新しい列でセグメント距離を計算し、別の新しい列で累積距離を計算するために以下を実行しています (latlonarray既に上に表示されており、distance(p1, p2)既に定義されています)。

    dists = [0.0]
    for n in xrange(len(lonlat)-1):
        dists.append(distance(lonlat[n+1], lonlat[n]))

    lonlatarray = numpy.array(lonlat).reshape((-1,2))
    distsarray = numpy.array(dists).reshape((-1,1))
    cumdistsarray = numpy.cumsum(distsarray).reshape((-1,1))

    print numpy.hstack((lonlatarray, distsarray, cumdistsarray))

[[   -51.203018      -29.996149        0.              0.        ]
 [   -51.203018      -29.99625         7.04461338      7.04461338]
 [   -51.20266       -29.996229       39.87928578     46.92389917]
 ..., 
 [   -51.64315       -29.717896       11.11669769  92529.72742791]
 [   -51.643112      -29.717737       11.77016407  92541.49759198]
 [   -51.642937      -29.717709       19.57670066  92561.07429263]]

私の主な質問は、「ループではなく配列操作のように、距離関数 (引数として行のペアを取る) を実行するにはどうすればよいですか?」です。(つまり、どうすれば適切にベクトル化できますか)

その他のトピックに関する質問は次のとおりです。

  • パンダを使用することにした場合、これを達成するための巧妙なトリックはありますか?
  • scipy.spatial.distance地理的距離 (haversine、大圏距離) を使用して「私のために働く」方法はありますか?

また、不必要に複雑なことをしている場合は、いくつかのヒントをいただければ幸いです。

皆様、ご関心をお寄せいただき、誠にありがとうございます。

4

1 に答える 1

3

元のデータlonlatを numpy 配列のペアとして表現し、これらの配列を配列distanceを受け入れる関数のバージョンに渡す必要があるようです。

たとえば、haversine distanceの定義を調べると、次のように簡単にベクトル化された式に変換できます。

def haversine_pairwise(phi, lam):

    dphi = phi[1:]-phi[:-1]
    dlam = lam[1:]-lam[:-1]

    # r is assumed to be a known constant
    return r*(0.5*(1-cos(dphi)) + cos(phi[1:])*cos(phi[:-1])*0.5*(1-cos(dlam)))

私自身はこれらの式に精通していませんが、希望する式に対してどのようにそれを行うことができるかを示していることを願っています. cumsumその後、すでに行ったように使用します。私が使用した配列スライス構文は、明確でない場合に備えて、ここに文書化されています。

于 2012-10-23T03:47:22.617 に答える