2012-10-23 20 views
1

我正在處理從描述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「爲我工作」使用地理距離(半徑,大圓距)?

此外,如果我做了任何不必要的複雜事情,我將不勝感激。

非常感謝大家的關注。

回答

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。如果不清楚,我使用的陣列切片語法記錄在here中。

+0

我已經開始編寫非常類似的函數,將原始數組作爲參數,並通過切片在非常函數內部構建phi lam,但是我覺得應該有一種更神奇的方式來實現這一點。你對公式的重寫也很好。如果有人有突破性答案,我會再等一等,否則很快我會回來接受你的答案。謝謝! – heltonbiker

+1

python的一個弱點是重複函數調用的緊密循環不能真正有效。如果你可以引導它們,Numpy可以讓事情變得高效。像cython和pypy這樣的工具可以克服這個限制,但對您的問題可能會過度。 – DaveP

+0

如果你(或任何人)有興趣,我在這裏發佈一個派生的問題與另一個(不同)的觀點:http://stackoverflow.com/q/13040738/401828 – heltonbiker