我正在使用一个数组,这个数组是根据描述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]
的距离列表,或者同一数组中的第三列。
需要注意的是,我已经有了一个返回两点(两个坐标对)之间距离的函数,但我不知道如何通过单个数组操作来应用它,而不是循环遍历行对。
目前,我正在执行以下操作,以计算一个新列中的线段距离,以及另一个新列中的累积距离(上面已经显示了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]]
我的主要问题是:"如何像数组操作而不是循环那样执行distance函数(它将一对行作为参数)?"(也就是说,如何正确地对它进行矢量化)
其他专题问题包括:
- 如果我决定使用Pandas,有没有什么聪明的方法可以做到这一点?
- 有没有办法使用地理距离(半正矢、大圆距离)让
scipy.spatial.distance
"为我工作"?
此外,如果我正在做任何不必要的复杂的事情,我会很感激一些提示。
非常感谢大家的关注。
1条答案
按热度按时间gfttwv5a1#
听起来像是需要将原始数据
lonlat
表示为一对numpy数组,然后将这些数组传递给接受数组的函数distance
版本。例如,查找haversine distance的定义,可以相当容易地将其转换为矢量化公式,如下所示:
我自己对这些公式并不熟悉,但希望这能告诉你如何对任何你想要的公式都能这样做。然后你可以像之前那样使用
cumsum
。我使用的数组切片语法在这里记录,以防不清楚。