1

我正在使用从描述 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]]

我的主要问题是:“我怎样才能像数组操作而不是循环一样执行距离函数(它以一对行作为参数)?” (也就是说,我怎样才能正确地对其进行矢量化)

其他主题性问题是:

  • 如果我决定使用 Pandas,是否有一些巧妙的技巧可以做到这一点?
  • 有没有办法scipy.spatial.distance使用地理距离(haversine,大圆距离)“为我工作”?

另外,如果我做任何不必要的复杂事情,我会很感激一些提示。

非常感谢大家的关注。

4

1 回答 1

3

听起来您需要将原始数据lonlat表示为一对 numpy 数组,然后将这些数组传递给distance接受数组的函数版本。

例如,查找hasrsine 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像你已经做的那样使用。我使用的数组切片语法记录在这里,以防不清楚。

于 2012-10-23T03:47:22.617 回答