我正在处理从描述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