当前位置: 首页 > 面试题库 >

在Python中向量化Haversine距离计算

何向荣
2023-03-14
问题内容

我正在尝试使用Haversine公式来计算由纬度和经度标识的一长串位置的距离矩阵,该公式采用两个坐标对的元组来产生距离:

def haversine(point1, point2, miles=False):
    """ Calculate the great-circle distance bewteen two points on the Earth surface.

    :input: two 2-tuples, containing the latitude and longitude of each point
    in decimal degrees.

    Example: haversine((45.7597, 4.8422), (48.8567, 2.3508))

    :output: Returns the distance bewteen the two points.
    The default unit is kilometers. Miles can be returned
    if the ``miles`` parameter is set to True.

    """

我可以使用嵌套的for循环计算所有点之间的距离,如下所示:

data.head()

   id                      coordinates
0   1   (16.3457688674, 6.30354512503)
1   2    (12.494749307, 28.6263955635)
2   3    (27.794615136, 60.0324947881)
3   4   (44.4269923769, 110.114216113)
4   5  (-69.8540884125, 87.9468778773)

使用一个简单的函数:

distance = {}
def haver_loop(df):
    for i, point1 in df.iterrows():
        distance[i] = []
        for j, point2 in df.iterrows():
            distance[i].append(haversine(point1.coordinates, point2.coordinates))

    return pd.DataFrame.from_dict(distance, orient='index')

但是考虑到时间的复杂性,这需要花费相当长的时间,大约需要20秒才能获得500点,而且我的清单要长得多。这让我着眼于矢量化,并且遇到了numpy.vectorize((docs)),但无法弄清楚如何在这种情况下应用它。


问题答案:

您可以将函数用作的参数np.vectorize(),然后可以将其用作的参数,pandas.groupby.apply如下所示:

haver_vec = np.vectorize(haversine, otypes=[np.int16])
distance = df.groupby('id').apply(lambda x: pd.Series(haver_vec(df.coordinates, x.coordinates)))

例如,具有以下示例数据:

length = 500
df = pd.DataFrame({'id':np.arange(length), 'coordinates':tuple(zip(np.random.uniform(-90, 90, length), np.random.uniform(-180, 180, length)))})

比较500点:

def haver_vect(data):
    distance = data.groupby('id').apply(lambda x: pd.Series(haver_vec(data.coordinates, x.coordinates)))
    return distance

%timeit haver_loop(df): 1 loops, best of 3: 35.5 s per loop

%timeit haver_vect(df): 1 loops, best of 3: 593 ms per loop


 类似资料:
  • 问题内容: 我在python中有numpy数组,其中包含很多(10k +)3D顶点(坐标为[x,y,z]的向量)。我需要计算这些点所有可能的对之间的距离。 使用scipy很容易: 但是由于引入新依赖项的项目政策,我无法使用它。 所以我想出了这个天真的代码: vert_dist()计算两个顶点之间的3D距离,其余代码仅对1D数组中的顶点进行迭代,并且对于每个顶点,它都计算同一数组中彼此之间的距离并生

  • 问题内容: 我有一个工作的PHP脚本,该脚本获取经度和纬度值,然后将它们输入到MySQL查询中。我只想将其制作成MySQL。这是我当前的PHP代码: 有谁知道如何完全使用MySQL?我浏览了一下互联网,但是关于它的大多数文献都令人困惑。 问题答案: 来自Google Code常见问题解答-使用PHP,MySQL和Google Maps创建商店定位器 : 这是一条SQL语句,它将找到距离37,-12

  • 我有一个用户的口味表: 我有电影类型内容表: 我正在尝试获取每个用户的偏好向量,并获取其与电影内容的相似性度量,以便通过点积推荐最偏好的电影: 为了计算距离,我首先通过以下方式标准化了用户的偏好表: 我不明白为什么规范化后表示不同的偏好?例如,第三个值和第五个值都是,但在标准化后,我得到了和,或者最大值转换为,这在点积之后给出的相似性值较小。 在计算点积之前对数据进行规范化是否正确?如果是,我做得

  • 我需要计算汽车行驶的距离!不是距离,不是距离到否。如果我们通过谷歌提供的API计算,距离可以完全不同。谷歌可以提供从一个点到另一个点的1公里距离,但汽车可以按照骑手想要的方式行驶800米。使用加速计没有帮助。它适用于步行,但绝不适用于更快的速度。 我尝试过使用Google的位置API:距离到或距离之间根本不是一个选项。它可以给出与IN REAL截然不同的结果。在真实的汽车中,可以通过非常短的地方并

  • 问题内容: 我想使用GeoDjango或GeoPy根据方向和距离计算一个点。 例如,如果我的点是(-24680.1613,6708860.65389),我想使用Vincenty距离公式找出北1KM,东1KM,苏尔1KM和西1KM的点。 我能找到的最接近的东西是distance.py(https://code.google.com/p/geopy/source/browse/trunk/geopy/

  • 问题内容: 问题 我想知道如何获取2个GPS点之间的距离和方位。我研究了haversine配方。有人告诉我,我也可以使用相同的数据找到轴承。 编辑 一切正常,但轴承还不能正常工作。轴承输出为负,但应在0-360度之间。设定数据应为水平方向, 且为: 这是我的新代码: 问题答案: 这是Python版本: