2017-10-10 138 views
0

我有一個4維數組,我需要計算兩個維的和。我看到apply出奇的慢。在N維數組中的邊距最快的總和:apply(X,MARGIN = c(1,2),sum)

我曾嘗試compiler庫,但速度幾乎提高:

library(compiler) 

X <- array(2, dim=c(1000,20,10,125)) 

suma <- function(X){ 
    apply(X, MARGIN=c(1,2), sum) 
} 

suma.cmp <- cmpfun(suma) 

benchmark(suma.cmp(X), suma(X), replications = 50) 

#  test replications elapsed relative user.self sys.self user.child 
#1 suma.cmp(X)   50 24.616 1.000 24.164 0.424   0 
#2  suma(X)   50 24.892 1.011 24.440 0.416   0 

我會給RCPP一試,但RcppArmadillo沒有4維數組,據我所知。

如何儘可能快地計算(apply(X, MARGIN=c(1,2), sum))?

回答

5

rowSums約快15倍。它很快進入C,所以我認爲它很難改進。

microbenchmark(
    apply = suma(X), 
    rowsum = rowSums(X, dims = 2), 
    times = 10 
) 
# Unit: milliseconds 
# expr  min  lq  mean median  uq  max neval cld 
# apply 692.14893 818.67450 828.66410 829.47926 874.23754 885.36019 10 b 
# rowsum 48.39865 49.85822 51.37486 51.09379 52.04339 56.29224 10 a 

identical(rowSums(X, dims = 2), suma(X)) 
# [1] TRUE 
+0

Thanks @Gregor。我們可以總結不連續的維度嗎? 'apply(X,MARGIN = c(1,3),sum)' – alberto

+1

否請參閱'?rowSums'中的文檔:*「dims:對於行\ *,總和或平均值超過維dims + 1,。 ..;對於col \ *它已超過維度1:dims。「*您可以**使用'aperm'來對這些維度進行排列,從而使您想要概括的所有維度都是連續的。 – Gregor