【发布时间】: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
假设我有一个逻辑数组:
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
使用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
【讨论】:
all 是一个原始函数,所以如果经常调用闭包,情况会更糟。这个答案用四个函数调用替换了 100*200*300 + 1 个函数调用(如果我计算正确的话)。