2个逻辑向量的元素之间的快速最小距离(间隔)(取2)

2024-01-07

我问了一个相关问题here https://stackoverflow.com/questions/21493662/minimum-distance-between-elements-in-two-logical-vectors但意识到我花费了太多时间来计算这个复杂的测量(目标是与随机测试一起使用,所以速度是一个问题)。所以我决定放弃权重,只使用两个度量之间的最小距离。所以这里我有 2 个向量(在数据框中用于演示目的,但实际上它们是两个向量。

       x     y
1  FALSE  TRUE
2  FALSE FALSE
3   TRUE FALSE
4  FALSE FALSE
5  FALSE  TRUE
6  FALSE FALSE
7  FALSE FALSE
8   TRUE FALSE
9  FALSE  TRUE
10  TRUE  TRUE
11 FALSE FALSE
12 FALSE FALSE
13 FALSE FALSE
14 FALSE  TRUE
15  TRUE FALSE
16 FALSE FALSE
17  TRUE  TRUE
18 FALSE  TRUE
19 FALSE FALSE
20 FALSE  TRUE
21 FALSE FALSE
22 FALSE FALSE
23 FALSE FALSE
24 FALSE FALSE
25  TRUE FALSE

在这里,我编写了一些代码来找到最小距离,但我需要更快的速度(删除不必要的调用和更好的矢量化)。也许我在 R 基地无法走得更快了。

## MWE EXAMPLE: THE DATA
x <- y <- rep(FALSE, 25)
x[c(3, 8, 10, 15, 17, 25)] <- TRUE
y[c(1, 5, 9, 10, 14, 17, 18, 20)] <- TRUE

## Code to Find Distances
xw <- which(x)
yw <- which(y)

min_dist <- function(xw, yw) {
    unlist(lapply(xw, function(x) {
        min(abs(x - yw))
    }))
}

min_dist(xw, yw)

有什么方法可以提高 R 基础的性能吗?使用dplyr or data.table?

我的向量更长(10,000 + 元素)。

Edit根据弗洛德尔的替补席。 flodel 我已经预料到我的 MWE 会出现问题,但我也不知道如何解决它。如果任何 x 位置小于最小 y 位置,就会出现问题。

x <- y <- rep(FALSE, 25)
x[c(3, 8, 9, 15, 17, 25)] <- TRUE
y[c(5, 9, 10, 13, 15, 17, 19)] <- TRUE


xw <- which(x)
yw <- which(y)

flodel <- function(xw, yw) {
   i <- findInterval(xw, yw)
   pmin(xw - yw[i], yw[i+1L] - xw, na.rm = TRUE)
}

flodel(xw, yw)

## [1] -2 -1 -6 -2 -2 20
## Warning message:
## In xw - yw[i] :
##   longer object length is not a multiple of shorter object length

flodel <- function(x, y) {
  xw <- which(x)
  yw <- which(y)
  i <- findInterval(xw, yw, all.inside = TRUE)
  pmin(abs(xw - yw[i]), abs(xw - yw[i+1L]), na.rm = TRUE)
}

GG1 <- function(x, y) {
  require(zoo)
  yy <- ifelse(y, TRUE, NA) * seq_along(y)
  fwd <- na.locf(yy, fromLast = FALSE)[x]
  bck <- na.locf(yy, fromLast = TRUE)[x]
  wx <- which(x)
  pmin(wx - fwd, bck - wx, na.rm = TRUE)
}

GG2 <- function(x, y) {
  require(data.table)
  dtx <- data.table(x = which(x))
  dty <- data.table(y = which(y), key = "y")
  dty[dtx, abs(x - y), roll = "nearest"] 
}

样本数据:

x <- y <- rep(FALSE, 25)
x[c(3, 8, 10, 15, 17, 25)] <- TRUE
y[c(1, 5, 9, 10, 14, 17, 18, 20)] <- TRUE

X <- rep(x, 100)
Y <- rep(y, 100)

单元测试:

identical(flodel(X, Y), GG1(X, Y))
# [1] TRUE

基准:

library(microbenchmark)
microbenchmark(flodel(X,Y), GG1(X,Y), GG2(X,Y))
# Unit: microseconds
#          expr       min         lq     median        uq        max neval
#  flodel(X, Y)   115.546   131.8085   168.2705   189.069   1980.316   100
#     GG1(X, Y)  2568.045  2828.4155  3009.2920  3376.742  63870.137   100
#     GG2(X, Y) 22210.708 22977.7340 24695.7225 28249.410 172074.881   100

[Matt Dowle 编辑] 24695 微秒 = 0.024 秒。对微小数据的微基准进行的推论很少能保持有意义的数据大小。

[由 flodel 编辑] 我的向量的长度为 2500,考虑到 Tyler 的声明 (10k),这相当有意义,但是好吧,让我们尝试使用长度为 2.5e7 的向量。我希望你能原谅我的使用system.time鉴于情况:

X <- rep(x, 1e6)
Y <- rep(y, 1e6)
system.time(flodel(X,Y))
#    user  system elapsed 
#   0.694   0.205   0.899 
system.time(GG1(X,Y))
#    user  system elapsed 
#  31.250  16.496 112.967 
system.time(GG2(X,Y))
# Error in `[.data.table`(dty, dtx, abs(x - y), roll = "nearest") : 
#   negative length vectors are not allowed

[来自 Arun 的编辑] - 使用 1.8.11 的 2.5e7 基准测试:
[Arun 编辑 2] - Matt 最近的更新时间faster二分查找/合并

require(data.table)
arun <- function(x, y) {
    dtx <- data.table(x=which(x))
    setattr(dtx, 'sorted', 'x')
    dty <- data.table(y=which(y))
    setattr(dty, 'sorted', 'y')
    dty[, y1 := y]
    dty[dtx, roll="nearest"][, abs(y-y1)]
}

# minimum of three consecutive runs
system.time(ans1 <- arun(X,Y))
#   user  system elapsed 
#  1.036   0.138   1.192 

# minimum of three consecutive runs
system.time(ans2 <- flodel(X,Y))
#   user  system elapsed 
#  0.983   0.197   1.221 

identical(ans1, ans2) # [1] TRUE
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2个逻辑向量的元素之间的快速最小距离(间隔)(取2) 的相关文章

  • 在 R 中绘制 Likert 变量的堆积条形图

    假设我有一个如下所示的数据框 P Q1 Q2 1 1 4 1 2 2 3 4 3 1 1 4 其中的列告诉我哪个人相应地回答了问题 q1 q2 中的哪一个 这些问题需要按照 4 分李克特量表进行回答 例如 批准 表示 1 稍微批准 表示 2
  • 在Python列表中交换元素的最快方法

    在Python中交换两个列表元素是否有比 L a L b L b L a 或者我必须求助于Cython http cython org or Weave http www scipy org Weave或类似的 看起来 Python 编译器
  • 只读取选定的列

    谁能告诉我如何仅读取下面每年数据的前 6 个月 7 列 例如使用read table Year Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 2009 41 27 25 31 31 39 2
  • 在 nHibernate 关系中使用实体的 Lite 版本?

    在某些情况下 出于性能原因 创建一个实体的轻量级版本 指向同一个表 但映射的列较少 这是一个好主意吗 例如 如果我有一个包含 50 列的联系人表 并且在一些相关实体中 我可能对 FirstName 和 LastName 属性感兴趣 那么创建
  • 将阴影区域添加到五分位数之间的直方图中

    All 我有一个包含 2 个直方图的图表 其中我还绘制了代表第 20 40 60 和 80 个百分位数的线条 下面的代码使用虚拟数据重现了类似的图表 data lt rbind data frame x rnorm 1000 0 1 g o
  • 在 r 中的 group_by 之后建模后取消列表列的嵌套

    我想对所有组进行线性回归group by 将模型系数保存在列表列中 然后使用 unnest 扩展列表列 这里我用的是mtcars以数据集为例 注 我想用do here becausebroom tidy 不适用于所有型号 mtcars gt
  • 相当于 min() 的 rowMeans()

    我在 R 邮件列表上多次看到这个问题 但仍然找不到满意的答案 假设我有一个矩阵m m lt matrix rnorm 10000000 ncol 10 我可以通过以下方式获得每行的平均值 system time rowMeans m use
  • 文本挖掘 pdf 文件/词频问题

    我正在尝试挖掘一篇具有丰富 pdf 编码和图表的文章的 pdf 我注意到 当我挖掘一些 pdf 文档时 我得到的高频词是 phi taeoe toe sigma gamma 等 它与某些 pdf 文档配合良好 但与其他文档配合使用时却得到这
  • 所有 x 轴标签未以 45 度显示

    I m having the code as like below But I m not getting all the x axis labels and it is not displaying in 45 degree when I
  • 纵向比较 R 中的值...并进行扭转

    我有许多人在多达四个时间段进行的测试结果 这是一个示例 dat lt structure list Participant ID c A A A A B B B B C C C C phase structure c 1L 2L 3L 4L
  • R 中用于调用 sed、rsync、ssh 等的 system() 的替代方案:函数是否存在,我应该编写自己的函数,还是我错过了重点?

    最近 我发现了base files命令 与其他命令一起使用 例如getwd write lines file show dir等等 似乎有许多 bash 函数的 R 等价物 我还在 R 中编写了一些函数来简化对ssh and rsync通过
  • Java 11 中使用堆栈跟踪的速度明显慢于 Java 8

    我正在比较 JDK 8 和 11 的性能jmh https openjdk java net projects code tools jmh 1 21 当我遇到一些令人惊讶的数字时 Java version 1 8 0 192 vendor
  • 如何使用 SparkR 1.6.0 写入 JDBC 源?

    使用 SparkR 1 6 0 我可以使用以下代码从 JDBC 源读取数据 jdbc url lt jdbc mysql localhost 3306 dashboard user
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 条件字体颜色 R Markdown

    我无法找到一种方法来根据变量的值 gt 0 0 或 r setup include FALSE x lt 4 This is an R Markdown document r if x gt 0 textcolor red Markdown
  • 使用 template.docx 从 Shiny App 编织 Word 文档

    我正在尝试使用 template docx 文件从闪亮的应用程序编写一个 Word 文档 我收到以下错误消息 pandoc exe template docx openBinaryFile 不存在 没有这样的文件或目录 以下 3 个文件当前
  • 实三次多项式的最快数值解?

    R 问题 寻找最快的方法来数值求解一堆已知具有实系数和三个实根的任意三次方程 据报道 R 中的 polyroot 函数对复杂多项式使用 Jenkins Traub 算法 419 但对于实多项式 作者参考了他们早期的工作 对于实三次或更一般的
  • Shiny:动态数据框构建; renderUI、观察、reactiveValues

    我认为如何使用 Shiny 的 renderUI 功能动态子集数据的问题经常出现 但我很难理解何时使用 renderUI 带有 uiOutput 而不是其他功能 包括观察 反应 反应值甚至条件面板 我想构建一个完全交互式的数据框架 其中每个
  • 如何修复 R 中 Kaplan Meier 图的风险表计算错误

    以下是一个数据帧 其中 6 个参与者中的每一个都有唯一的 record ID 我想绘制一个生存分析图 其中包含感兴趣事件的复发以及在时间间隔 tstart 到 tstop 内 暴露 药物剂量 数值变量 的时间依赖性协变量 每个参与者的最大
  • 如何将plot中的单变量列表图表转换为ggplot2格式?

    我正在搜索 但仍然找不到一个非常简单的问题的答案 我们如何使用 R 中的 ggplot2 生成一个变量的简单线图 我正在分析时间序列数据 并且想要对图表进行更复杂的操作 我认为如果我使用 ggplot2 代替会更好plot It works

随机推荐

  • Servlet Faces Servlet 不可用(richfaces 4、tomcat 7)

    我正在尝试我的第一个 richfaces 项目 因此 我创建了一个新的 JSF 项目 使用 JBoss Tools eclipse 插件 并选择了以下选项 JSF2 0 JSFKickStartWithoutLibs 我没有对生成的示例进行
  • 如何显示图片?

    我在调用图片进行查看时遇到问题 在我的应用程序中 他们单击按钮后 我想将他们带到一个新页面 其中将显示图片并在其下方显示一些文本 对于这个例子 如果狗位于页面顶部 那么我想要一张图片 然后在它下面说我想要诸如品种和品种成本之类的东西 谁能帮
  • 我怎样才能修复“&需要左值”[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 所以 我创建了一个项目并复制本教程 https github com microsoft DirectX Graphic
  • 在列表中使用两种单独的字符串类型

    好的 对于我的 C 编程课程 我正在制作一款冒险游戏 我想我明白如何做大部分事情 但我在建立 世界 时遇到了困难 我有一个面向世界的课程 World cs 我开始为每个房间创建一个列表 然而 我很困惑为每个房间添加名称和描述 例如 如果Li
  • 可见命令出现在上下文菜单中的时间

    我正在尝试使用 menuContribution 中的 visibleWhen 表达式配置上下文菜单中命令的可见性 我想做的是仅当您执行以下操作时才使该命令在上下文菜单中可见 在资源视图 或包视图 中右键单击某些文件类型 资源 右键单击已打
  • 使用 tkinter 创建椭圆形的流畅运动

    我正在尝试使用 tkinter 创建 Connect Four 一旦圆盘被放置在特定的柱中 我希望它以流体运动下降到柱的底部 我尝试过使用 Canvas 类的移动命令 但我不确定我是否使用错误 或者也许我最好在每次迭代中删除并重新绘制椭圆形
  • 仅对带有 Pandas 的字符串列应用转换,忽略数值数据

    所以 我有一个相当大的数据框 有 85 列和近 90 000 行 我想在所有数据框中使用 str lower 但是 有几列包含数字数据 有一个简单的解决方案吗 gt df A B C 0 10 John Dog 1 12 Jack Cat
  • 使用 Vue.JS 删除多维数组内的值

    早上好 我有以下表格 当您单击 新项目 按钮时 一个新的文本字段将添加到相关部分 如果单击 新部分 按钮 则会创建一个新部分 当您单击该部分右上角的 X 时 该部分将成功删除 但是 我正在尝试实现每个 添加 文本字段下方 右侧 的 X 我想
  • Python:按日期对列表进行排序?

    是否可以按日期对列表进行排序 它用于流程图 因此必须以较小列表对的列表格式进行组织 我希望能够按日期排序 2014 5 29 19 2014 5 28 16 2014 5 30 20 2014 5 23 16 2014 5 22 1225
  • 如何在 Web 应用程序中实现 REST?

    我想知道如何在我的 Web 应用程序中实现 REST 我想创建一个基于此服务的网络应用程序 但我不知道该怎么做 现在 我使用 J2EE 和 Tomcat 这些技术应该考虑哪些因素 EDIT 抱歉 我的意思是 RESTful 服务 REST
  • CSS 中的动态气泡

    I m trying to make something like this 我想使用纯CSS Bootstrap v3 已加载 我已经非常接近类似的事情了 bubble position relative left 15px paddin
  • 如何为 @Html.ActionLink cshtml 页面中新打开的选项卡的标题设置名称

    我当前的代码在Index cshtml page Html ActionLinks Html ActionLink objList Name Name ControllerName new Id objList Id new target
  • 在 web.xml 中使用 JSF EL 表达式

    我可以在 web xml 中使用 EL 表达式吗 像这样 Web xml
  • 如果父类没有实现可序列化,则序列化子类?

    public class Employee2 extends Employee1 public class Employee1 extends Employee0 public class Employee0 现在我序列化 Employee
  • 如何删除默认的 ASP.NET Core Identity 端点?

    假设我想编写自己的登录 注销端点及其视图 但由于某种原因 我正在努力删除现有端点 每当我删除可能与这些端点相关的内容时 它们就会重新创建自己并返回默认视图 基本上我想删除尽可能多的从 ASP NET Core Identity 生成的默认端
  • 如何让 Android 设备振动?不同频率?

    我写了一个Android应用程序 现在 我想让设备在发生特定操作时振动 我怎样才能做到这一点 Try import android os Vibrator Vibrator v Vibrator getSystemService Conte
  • Laravel 将所有请求重定向到 HTTPS

    我们的整个网站将通过 https 提供服务 我的每条路线都有 https 但是 如果他们尝试通过 http 进行访问 我该如何将他们重定向到 https Route group array https function all of our
  • 如何从(非网络)Python 客户端访问经过身份验证的 Google App Engine 服务?

    我有一个 Google App Engine 应用程序 http mylovelyapp appspot com http mylovelyapp appspot com 它有一个页面 mylovelypage 目前 该页面只是self r
  • OpenCV 重映射插值错误?

    我正在使用 opencv 重映射函数将图像映射到另一个坐标系 然而 我的初步测试表明插值存在一些问题 在这里 我给出了一个简单的示例 即图像的常量 0 1 像素偏移 除了位置 50 50 之外 其他位置均为 0 import cv2 imp
  • 2个逻辑向量的元素之间的快速最小距离(间隔)(取2)

    我问了一个相关问题here https stackoverflow com questions 21493662 minimum distance between elements in two logical vectors但意识到我花费