如何解决如何在python中更快地计算多个点组合之间的最小地理位置距离?
我是Python的新手。我试图找到每个客户到商店之间的最小距离。目前,我的数据中有约1500家商店和约67万名客户。我必须计算670K客户x 1500家商店的地理位置距离,并找到每个客户的最小距离。
我在下面创建了Haversine函数:
import numpy as np
def haversine_np(lon1,lat1,lon2,lat2):
lon1,lat2 = map(np.radians,[lon1,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)。由于无法共享真实数据的摘要,因此下面的数字组成了。
客户编号|纬度|经度
A123 | 39.342 | -40.800
B456 | 38.978 | -41.759
C789 | 36.237 | -77.348
商店ID |纬度|经度
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))
更新:我在此链接上使用了答案,并且可以正常工作。 Efficient computation of minimum of Haversine distances
解决方法
这可以通过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,2347407.258650098]]
您还可以使用kilometers
,miles
,feet
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。