我正在處理從描述GPS軌跡的地理座標列表創建的數組。該數據是這樣的:使用自定義函數而不是減法計算numpy數組的差異
[[-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]
,或者是同一個數組中的第三列。
重要的是要說我已經有一個函數返回兩點之間的距離(兩個座標對),但我不知道如何將它應用於單個數組操作,而不是循環遍歷行對。
目前我做在另一個新列以下方法來計算在一個新的列段的距離,和累積距離(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
「爲我工作」使用地理距離(半徑,大圓距)?
此外,如果我做了任何不必要的複雜事情,我將不勝感激。
非常感謝大家的關注。
我已經開始編寫非常類似的函數,將原始數組作爲參數,並通過切片在非常函數內部構建phi lam,但是我覺得應該有一種更神奇的方式來實現這一點。你對公式的重寫也很好。如果有人有突破性答案,我會再等一等,否則很快我會回來接受你的答案。謝謝! – heltonbiker
python的一個弱點是重複函數調用的緊密循環不能真正有效。如果你可以引導它們,Numpy可以讓事情變得高效。像cython和pypy這樣的工具可以克服這個限制,但對您的問題可能會過度。 – DaveP
如果你(或任何人)有興趣,我在這裏發佈一個派生的問題與另一個(不同)的觀點:http://stackoverflow.com/q/13040738/401828 – heltonbiker