【问题标题】:Faster way of applying `all` function?应用`all`函数的更快方法?
【发布时间】:2020-03-20 11:33:48
【问题描述】:

假设我有一个逻辑数组:

dimensions = c(10,100,200,300)
x = runif(prod(dimensions))>0.3
dim(x) = dimensions

有没有更快的方法来获得结果:

y = colMeans(apply(x,2:4,all))

?

Apply 很慢,而且这个用例很简单,所以我徘徊...

【问题讨论】:

    标签: r vectorization sapply


    【解决方案1】:

    使用colSums:

    system.time(
      y <- colMeans(apply(x,2:4,all))
      )
    # user      system     elapsed 
    #6.916       0.058       6.978 
    
    system.time(
    z <- colMeans(colSums(x, dims = 1) == dim(x)[1])
    )
    # user      system     elapsed 
    #0.117       0.000       0.117
    
    identical(y, z)
    #[1] TRUE
    

    【讨论】:

    • 令人惊叹。非常感谢。顺便问一下,你知道它为什么这么快吗?
    • @lrnv 函数调用非常昂贵。 all 是一个原始函数,所以如果经常调用闭包,情况会更糟。这个答案用四个函数调用替换了 100*200*300 + 1 个函数调用(如果我计算正确的话)。
    猜你喜欢
    • 2023-01-20
    • 2020-03-27
    • 2019-10-09
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    相关资源
    最近更新 更多