python - 如何在 python 中更快地计算多个点组合之间的最小地理距离?

标签 python python-3.x haversine

<分区>

我正在尝试找出每位顾客与商店之间的最小距离。目前,我的数据中有约 1500 家商店和约 67 万名顾客。我必须计算 670K 客户 x 1500 家商店的地理距离,并找到每个客户的最小距离。

我在下面创建了 haversine 函数:

import numpy as np
def haversine_np(lon1, lat1, lon2, lat2):

    lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2])

    dlon = lon2 - lon1
    dlat = lat2 - lat1

    a = np.sin(dlat/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2.0)**2

    c = 2 * np.arcsin(np.sqrt(a))
    miles = 6367 * c/1.609
    return miles

我的数据集如下所示,1 个客户数据框 (cst_geo) 和 1 个商店数据框 (store_geo)。以下数字是我编造的,因为我无法分享真实数据的片段:

<表类="s-表"> <头> 客户编号 纬度 经度 <正文> A123 39.342 -40.800 B456 38.978 -41.759 C789 36.237 -77.348
<表类="s-表"> <头> 商店编号 纬度 经度 <正文> S1 59.342 -60.800 S2 28.978 -71.759 S3 56.237 -87.348

我在下面编写了一个 for 循环来尝试进行此计算,但运行时间超过 8 小时。我曾尝试使用 deco 但无法进一步优化它。

mindist = []
for i in cst_geo.index:
    dist = []
    for j in store_geo.index:
        dist.append(haversine_np(cst_geo.longitude[i], cst_geo.latitude[i],
                                 store_geo.longitude[j], store_geo.latitude[j]))    
    mindist.append(min(dist))

最佳答案

这可以用 geopy 来完成

from geopy.distance import geodesic

customers = [
    (39.342, -40.800),
    (38.978, -41.759),
    (36.237, -77.348),
]
stores = [
    (59.342, -60.800),
    (28.978, -71.759),
    (56.237, -87.348),
]
matrix = [[None] * len(customers)] * len(stores)
for index, i in enumerate(customers):
    for j_index, j in enumerate(stores):
        matrix[j_index][index] = geodesic(i, j).meters

输出

[[3861568.3809260903, 3831526.290564832, 2347407.258650098, 2347407.258650098], 
[3861568.3809260903, 3831526.290564832, 2347407.258650098, 2347407.258650098],
 [3861568.3809260903, 3831526.290564832, 2347407.258650098, 2347407.258650098]]

您还可以用其他单位表示距离,例如 kmmilesfeet ...

关于python - 如何在 python 中更快地计算多个点组合之间的最小地理距离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64339689/

相关文章:

当进程数和工作线程数增加时,Python 多处理池 API 无法有效工作

python - 测试测试函数装饰器

python - 鼠兔连接丢失 Error : pika. exceptions.StreamLostError : Stream connection lost: ConnectionResetError(104, 'Connection reset by peer' )

python - 如何自动回答python中的脚本

Python成像,调整Turtle Graphics窗口大小

python - 如何从还包含文本值的列中的字符串值中删除 '.0' 或小数点?

java - 尽管 python 代码正确,但仍从 nifi ExecuteScript 处理器获取语法错误

php - 计算起点半径内位置的最佳方法

javascript - 2 点之间的距离

python - 如何使用 haversine 距离矩阵返回满足距离阈值标准的所有点对