pandas 使用自定义函数而不是减法计算numpy数组的diff

oknwwptz  于 2023-01-01  发布在  其他
关注(0)|答案(1)|浏览(120)

我正在使用一个数组,这个数组是根据描述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 "为我工作"?

此外,如果我正在做任何不必要的复杂的事情,我会很感激一些提示。
非常感谢大家的关注。

gfttwv5a

gfttwv5a1#

听起来像是需要将原始数据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。我使用的数组切片语法在这里记录,以防不清楚。

相关问题