2012-10-23 19 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