- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 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) ,但无法弄清楚如何在这种情况下应用它。
最佳答案
来自 haversine's function definition
,它看起来非常可并行化。因此,使用最好的 NumPy 向量化工具之一,又名 broadcasting
并将数学函数替换为 NumPy 等价物 ufuncs
,这是一个矢量化解决方案 -
# Get data as a Nx2 shaped NumPy array
data = np.array(df['coordinates'].tolist())
# Convert to radians
data = np.deg2rad(data)
# Extract col-1 and 2 as latitudes and longitudes
lat = data[:,0]
lng = data[:,1]
# Elementwise differentiations for lattitudes & longitudes
diff_lat = lat[:,None] - lat
diff_lng = lng[:,None] - lng
# Finally Calculate haversine
d = np.sin(diff_lat/2)**2 + np.cos(lat[:,None])*np.cos(lat) * np.sin(diff_lng/2)**2
return 2 * 6371 * np.arcsin(np.sqrt(d))
运行时测试 -
其他np.vectorize based solution
已经显示出与原始代码相比性能改进的一些积极 promise ,因此本节将比较基于发布广播的方法与那个方法。
函数定义-
def vectotized_based(df):
haver_vec = np.vectorize(haversine, otypes=[np.int16])
return df.groupby('id').apply(lambda x: pd.Series(haver_vec(df.coordinates, x.coordinates)))
def broadcasting_based(df):
data = np.array(df['coordinates'].tolist())
data = np.deg2rad(data)
lat = data[:,0]
lng = data[:,1]
diff_lat = lat[:,None] - lat
diff_lng = lng[:,None] - lng
d = np.sin(diff_lat/2)**2 + np.cos(lat[:,None])*np.cos(lat) * np.sin(diff_lng/2)**2
return 2 * 6371 * np.arcsin(np.sqrt(d))
时间 -
In [123]: # Input
...: length = 500
...: d1 = np.random.uniform(-90, 90, length)
...: d2 = np.random.uniform(-180, 180, length)
...: coords = tuple(zip(d1, d2))
...: df = pd.DataFrame({'id':np.arange(length), 'coordinates':coords})
...:
In [124]: %timeit vectotized_based(df)
1 loops, best of 3: 1.12 s per loop
In [125]: %timeit broadcasting_based(df)
10 loops, best of 3: 68.7 ms per loop
关于python - 在 Python 中矢量化 Haversine 距离计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34502254/
因此,我使用 Haversine 公式继续沿从 Google map 检索的路线查找位置,如下所示,使用英里数。 var R = 3959 //in miles; var lat1 = result.
我正在使用 mysql 来计算接近度,为此我创建了一个名为 distance 的过程,如下所示,但该过程无法正常工作,但 sql 语句正在运行,所以这里有什么区别,因为我猜两者都是Haversine
我有一个 dataframe 和 2.7MM 坐标,以及一个单独的 list ~2,000 坐标。我正在尝试返回每一行 中的坐标与列表中的每个坐标 之间的最小距离。以下代码适用于小规模(200 行的数
我正在尝试实现 Haversine我正在编写的一个小 GPS 程序中的公式。距离计算似乎是正确的。但是,我认为方位是以弧度计算的,我不知道如何将结果正确转换为罗盘方向(0 表示北,90 表示东,等等)
我正在用 PHP 实现 Haversine 公式,如下所示 $result=mysqli_query($mysqli,"SELECT *,( 6371 * acos( cos( radians({$l
我正在用 c# 创建一个距离计算器,使用半正弦方程来计算经度和纬度之间的距离,但它给出了错误的输出,有人知道为什么吗?第一个 long 和 lat 值是威尔士(类戈)的一个地方,另一个是英格兰(曼彻斯
假设我有这两个表: the_schedule_table: +-----+---------------------+---------------------+-----------+-------
我正在尝试创建一个基本的 Web 应用程序来检测用户的地理位置、查询 mySQL 数据库并返回 5 公里内的所有公交车站。 包含经度和纬度的 GTFS 提要已插入到 mySQL 数据库中,我找到了一个
我正在尝试通过距离参数(以英里为单位)将用户位置(通过 URL 中的参数发送)与 offers.offer_lat 和 offers.offer_long(在我的数据库中)进行比较 我现在快要疯了,我
我正在尝试使用 Haversine 公式来定位距离我当前位置 1 英里以内的所有公交车站。我有一个 MySQL 数据库表,其中包含 5500 个公交车站的纬度/经度位置,并且正在使用以下 SQL 查询
我有 39,803 个不同的经纬度点(这里是前 5 个点) lat lon 0 27.269987 -82.497004 1 27.537598 -82.508422 2 27.3
SELECT id, ( 3959 * acos( cos( radians(51.509980) ) * cos( radians( lat ) ) * cos( radians(
我有一个坐标列表,可以使用 haversine distance 计算所有点之间的距离矩阵公制。 坐标来自 numpy.array 形状 (n, 2) 的 (latitude, longitude)
我有两个包含纬度和经度的数组。我想计算数组中每一对纬度和经度与其他每一对纬度和经度之间的距离。这是我的两个数组。 lat_array array([ 0.33356456, 0.33355585,
这里的新手对 mysql 有很好的了解,但在空间查询上卡住了。 我查看了许多与空间数据相关的问题,以找到给定纬度/经度周围的附近位置,但由于我的空间表格式不同,最终没有得到正确的结果(如果已经有问题,
我正在尝试在 WordPress 中使用 Haversine 公式,使用自定义帖子类型“stores”,自定义字段包含 latitude、longitude 和 street_address 仅供显示
我有一个看起来像这样的结果表(目前只有 1 个结果): 这是我生成该结果的查询: SELECT DISTINCT ID, post_author, post_title, post_type, pos
我的代码中有以下几行 query = "SELECT id, " \ "( 3959 * acos( cos( radians(37) ) * cos( radians( %(
我一直在通过 Nikil Abraham 的 Coding for Dummies 学习代码。书中有一个包含代码的元素,用于为一家餐厅开发一个应用程序,该应用程序可以在距离餐厅 5 到 10 分钟的步
我有两个数据帧,我想循环遍历它们,应用半正矢函数,并在新数组中构造结果。我想获取 da_store 中第一家餐厅的 lat、lng 坐标,对 da_univ 的所有 lat、lng 应用半正矢函数,存
我是一名优秀的程序员,十分优秀!