【问题标题】:Calculate diff of a numpy array using custom function instead of subtraction使用自定义函数而不是减法计算 numpy 数组的差异
【发布时间】:2012-10-12 21:50:07
【问题描述】:

我正在处理从描述 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、great-circle distance)来“为我工作”?

另外,如果我正在做任何不必要的复杂操作,我将不胜感激。

非常感谢大家的关注。

【问题讨论】:

    标签: python numpy multidimensional-array pandas vectorization


    【解决方案1】:

    听起来您需要将原始数据 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 以防不清楚。

    【讨论】:

    • 我已经开始编写非常相似的函数,将原始数组作为参数,并通过切片在函数内部构建 phi 和 lam,但我觉得应该有一种更神奇的方式来实现这一点。您对公式的重写看起来也不错。我会再等一会儿,以防有人提出突破性的答案,否则我很快就会回来接受你的。谢谢!
    • python 的一个弱点是重复函数调用的紧密循环不能真正变得高效。如果你可以对它们进行矢量化,Numpy 可以让事情变得高效。像 cython 和 pypy 这样的工具可以克服这个限制,但对于你的问题来说可能有点过头了。
    • 如果您(或任何人)有兴趣,我在这里发布了一个带有另一个(不同)观点的派生问题:stackoverflow.com/q/13040738/401828
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多