相关疑难解决方法(0)

Python:加快地理比较

我编写了一些包含嵌套循环的代码,其中内循环执行大约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)

python optimization geography distance

11
推荐指数
2
解决办法
6794
查看次数

向量化以计算许多距离

我是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)

但是,这给出的是行的总数,但不能满足我的要求。

谁能指出我如何使代码正常工作?

python numpy vectorization pandas

5
推荐指数
1
解决办法
566
查看次数

成对的半径距离计算

我有两个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 arrays performance numpy haversine

4
推荐指数
3
解决办法
2118
查看次数