我编写了一些包含嵌套循环的代码,其中内循环执行大约150万次.我在这个循环中有一个函数,我正在尝试优化.我做了一些工作,并得到了一些结果,但我需要一些输入来检查我所做的事情是否合情合理.
一些背景:
我有两个地理点集合(纬度,经度),一个相对较小的集合和一个相对庞大的集合.对于小集合中的每个点,我需要找到大集合中的最近点.
显而易见的方法是使用hasrsine公式.这里的好处是距离绝对准确.
from math import radians, sin, cos, asin, sqrt
def haversine(point1, point2):
"""Gives the distance between two points on earth.
"""
earth_radius_miles = 3956
lat1, lon1 = (radians(coord) for coord in point1)
lat2, lon2 = (radians(coord) for coord in point2)
dlat, dlon = (lat2 - lat1, lon2 - lon1)
a = sin(dlat/2.0)**2 + cos(lat1) * cos(lat2) * sin(dlon/2.0)**2
great_circle_distance = 2 * asin(min(1,sqrt(a)))
d = earth_radius_miles * great_circle_distance
return d
Run Code Online (Sandbox Code Playgroud)
但是,在我的机器上运行这150万次大约需要9秒(根据时间).由于准确的距离并不重要,我只需要找到最近的点,我决定尝试其他一些功能.
毕达哥拉斯定理的简单实现给了我大约30%的加速.考虑到我可以做得更好,我写了以下内容:
def dumb(point1, point2):
lat1, lon1 …Run Code Online (Sandbox Code Playgroud) 我是numpy / pandas和矢量化计算的新手。我正在执行数据任务,其中有两个数据集。数据集1包含一个经度和纬度的位置列表以及一个变量A。数据集2还包含一个经度和纬度的位置列表。对于数据集1中的每个位置,我想计算其到数据集2中所有位置的距离,但我只想获得数据集2中小于变量A的值的位置计数。数据集非常大,因此我需要使用向量化运算来加快计算速度。
例如,我的数据集1可能如下所示:
id lon lat varA
1 20.11 19.88 100
2 20.87 18.65 90
3 18.99 20.75 120
Run Code Online (Sandbox Code Playgroud)
我的数据集2可能如下所示:
placeid lon lat
a 18.75 20.77
b 19.77 22.56
c 20.86 23.76
d 17.55 20.74
Run Code Online (Sandbox Code Playgroud)
然后对于数据集1中的id == 1,我想计算其到数据集2中所有四个点(a,c,c,d)的距离,并且我想知道有多少距离小于对应的距离varA的值。例如,计算出的四个距离为90、70、120、110,而varA为100。则该值应为2。
我已经有一个向量化函数来计算两对坐标之间的距离。假设函数(haversine(x,y))正确实现,我有以下代码。
dataset2['count'] = dataset1.apply(lambda x:
haversine(x['lon'],x['lat'],dataset2['lon'], dataset2['lat']).shape[0], axis
= 1)
Run Code Online (Sandbox Code Playgroud)
但是,这给出的是行的总数,但不能满足我的要求。
谁能指出我如何使代码正常工作?
我有两个lat和long数组.我想计算每对lat和long之间的距离,以及阵列中每隔一对lat和long.这是我的两个数组.
lat_array
array([ 0.33356456, 0.33355585, 0.33355585, 0.33401788, 0.33370132,
0.33370132, 0.33370132, 0.33371075, 0.33371075, 0.33370132,
0.33370132, 0.33370132, 0.33356488, 0.33356488, 0.33370132,
0.33370132, 0.33370132, 0.33401788, 0.33362632, 0.33362632,
0.33364007, 0.33370132, 0.33401788, 0.33401788, 0.33358399,
0.33358399, 0.33358399, 0.33370132, 0.33370132, 0.33362632,
0.33370132, 0.33370132, 0.33370132, 0.33370132, 0.33370132,
0.33356488, 0.33356456, 0.33391071, 0.33370132, 0.33356488,
0.33356488, 0.33356456, 0.33356456, 0.33356456, 0.33362632,
0.33364804, 0.3336314 , 0.33370132, 0.33370132, 0.33370132,
0.33364034, 0.33359921, 0.33370132, 0.33360397, 0.33348863,
0.33370132])
long_array
array([ 1.27253229, 1.27249141, 1.27249141, 1.27259085, 1.2724337 ,
1.2724337 , 1.2724337 , 1.27246931, 1.27246931, 1.2724337 ,
1.2724337 , 1.2724337 , …Run Code Online (Sandbox Code Playgroud) python ×3
numpy ×2
arrays ×1
distance ×1
geography ×1
haversine ×1
optimization ×1
pandas ×1
performance ×1