快速计算所有点之间的距离的方法

未知

我有一些代码生成一个数据帧中所有点之间的距离矩阵,该矩阵使用tidyverse函数。但是,它的工作速度非常慢。有人知道做同一件事的方法更快吗?

示例数据和工作代码:

library(tidyverse)
locs <- data.frame(ID = 1:4000, x = runif (4000, 0, 1), y = runif (4000, 0, 1))
df1 <- locs %>% 
mutate(k = 1)
df2 <- df1 %>% 
full_join(df1, by = "k") %>% 
mutate(length = sqrt((x.x - x.y)^2 + (y.x - y.y)^2)) %>% 
select(ID.x, ID.y, length)
dists <- matrix(data = df2$length, nrow = nrow(df1), ncol = nrow(df1))
弗洛里安

您可以使用基本R函数dist

locs <- data.frame(ID = 1:10, x = runif (10, 0, 1), y = runif (10, 0, 1))
dist(locs[,2:3], upper = T, diag = T)

输出:

            1          2          3          4          5          6          7          8          9         10
1  0.00000000 1.10309601 0.98790825 0.54490600 0.42478532 1.06323764 0.31094245 0.52593635 0.44695830 0.85010761
2  1.10309601 0.00000000 0.29292865 0.93412638 0.74551902 0.17160290 0.83557056 0.62393711 0.74218236 0.57669081
3  0.98790825 0.29292865 0.00000000 0.69626767 0.72278486 0.13085561 0.78064096 0.46359296 0.73098652 0.72732431
4  0.54490600 0.93412638 0.69626767 0.00000000 0.65426980 0.81617143 0.59851262 0.36551106 0.68253093 1.00018238
5  0.42478532 0.74551902 0.72278486 0.65426980 0.00000000 0.75537605 0.11384534 0.36844164 0.02911855 0.42844270
6  1.06323764 0.17160290 0.13085561 0.81617143 0.75537605 0.00000000 0.82826619 0.55014297 0.75867851 0.68258388
7  0.31094245 0.83557056 0.78064096 0.59851262 0.11384534 0.82826619 0.00000000 0.37224997 0.13688270 0.54088523
8  0.52593635 0.62393711 0.46359296 0.36551106 0.36844164 0.55014297 0.37224997 0.00000000 0.39086196 0.64185453
9  0.44695830 0.74218236 0.73098652 0.68253093 0.02911855 0.75867851 0.13688270 0.39086196 0.00000000 0.40400339
10 0.85010761 0.57669081 0.72732431 1.00018238 0.42844270 0.68258388 0.54088523 0.64185453 0.40400339 0.00000000

具有1000条记录的基准:

library(dplyr)
library(microbenchmark)
locs <- data.frame(ID = 1:1000, x = runif (1000, 0, 1), y = runif (1000, 0, 1))

f1 <- function()
{
  df1 <- locs %>% 
    mutate(k = 1)
  df2 <- df1 %>% 
    full_join(df1, by = "k") %>% 
    mutate(length = sqrt((x.x - x.y)^2 + (y.x - y.y)^2)) %>% 
    select(ID.x, ID.y, length)
  dists <- matrix(data = df2$length, nrow = nrow(df1), ncol = nrow(df1))
}

f2 <- function(){dist(locs[,2:3],upper = T,diag=T)}

microbenchmark(f1())
microbenchmark(f2())

结果:

Unit: milliseconds
 expr      min       lq     mean   median     uq      max neval
 f1() 81.74188 245.8014 276.4318 259.7682 294.01 567.9409   100

Unit: milliseconds
 expr      min       lq     mean  median       uq      max neval
 f2() 6.956302 7.330661 8.675304 8.11507 8.981121 18.77783   100

希望这可以帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

计算包含xy坐标列表的数据框中所有点之间的距离的方法

轴上所有点之间的距离相等

查找所有点对之间的欧几里得距离

在每个时间步骤中计算所有个体之间距离的更快方法

计算所有点到python中给定点的加权距离

确定景观中具有特定属性的点与所有点之间距离的最快方法

Seaborn histplot stat=count 不计算所有点

计算所有距离之和

修改Levenshtein距离算法以不计算所有距离

给定点的坐标,找到彼此之间存在一定距离的所有点对?

2个向量中所有点之间的欧式距离

寻找所有点和多边形边界之间的最小距离

如何找到多个点之间所有点的坐标?

查找矩形内所有点的快速算法

计算所有行之间差异的最有效方法

点之间的计算距离

计算所有列之间的成对相关

计算所有矩阵元素到所有矩阵元素的大圆距离

MKMapView在所有点之间绘制连接的线

如何仅使用两个变量找到两个点之间的距离,然后存储所有点并获得形状?

如何仅使用两个变量找到两个点之间的距离,然后存储所有点并获得形状?

查找数据集中所有点的距离中最近的点-Python

三角形点的距离变大,但是所有点的速度相同

计算所有置位最快的方法是什么?

使用 pandas 方法计算所有列中的项目

计算所有列差异的最快方法

计算GPS点之间的距离

从点之间的距离计算图形

所有点到第一个点的距离