2016-01-15 34 views
0

我有一個三維數組(例如尺寸= 4000 x 4000 x 2)。現在我想計算第三維上的產品以獲得二維數組(尺寸= 4000 x 4000)。快速計算R中3D數組一維的產品的方法

我試着用prod()apply()函數內計算產品;然而這相當耗時。因此,我想知道這樣的計算是否有更快更有效的方法?

apply()方法:

A <- array(runif(4000*4000*2),dim=c(4000,4000,2)) 
system.time(apply(A, c(1,2), prod)) 

這裏更小例如具有陣列B

B <- array(c(1,2,1,2,3,4,3,4),dim=c(2,2,2)) 

的結果B_res

B_res <- array(c(3,3,8,8),dim=c(2,2)) 

更新: 正如@ 42所提到的那樣 - 這可以通過明智(手動)乘法來完成,如:B_res <- B[,,1]*B[,,2]。但是,第三維的大小可能在2到x之間。因此手動編碼B[,,1]*B[,,2]... *B[,,x]可能不可行。這裏一個循環在一個循環中計算可能是一個可能的解決方案:

array_prod <- function(C){ 
    C_res <- C[,,1] 
    for(i in 2:dim(C)[3]){ 
    C_res <- C_res*C[,,i] 
    } 
    return(C_res) 
} 

這裏三種方法(申請,說明書逐元素和循環乘法)的比較:

A <- array(runif(400*400*10),dim=c(400,400,10)) 
system.time(apply(A, c(1,2), prod)); system.time(A[,,1]*A[,,2]*A[,,3]*A[,,4]*A[,,5]*A[,,6]*A[,,7]*A[,,8]*A[,,9]*A[,,10]); system.time(array_prod(A)) 
    user system elapsed 
    0.492 0.021 0.512 
    user system elapsed 
    0.031 0.000 0.032 
    user system elapsed 
    0.032 0.001 0.032 

...其表明應用函數明顯比其他兩種基本類似速度快的方法慢得多。

+1

你應該發佈一個3x3x2數組的例子,並說出正確的答案可能是什麼。如果它只是元素多重,那麼只是'A [,, 1] * A [,, 2]' –

回答

2

這表明,使用R中所謂的向量化方法,通過將前兩個維留空並使用運算符來完成元素數組乘法。也可以把TRUE來表示一個特定維度的所有實例:

A <- array(1:(4*4*2),dim=c(4,4,2)) 
apply(A, c(1,2), prod) 
#============ 
    [,1] [,2] [,3] [,4] 
[1,] 17 105 225 377 
[2,] 36 132 260 420 
[3,] 57 161 297 465 
[4,] 80 192 336 512 
#============= 
A[ , , 1]*A[ , , 2] 
    [,1] [,2] [,3] [,4] 
[1,] 17 105 225 377 
[2,] 36 132 260 420 
[3,] 57 161 297 465 
[4,] 80 192 336 512 

,這表明在性能上100倍的改善(雖然我厭倦了等待申請的4000x4000版本來運行,所以我只顯示結果用這個例子中的向量化方法:)

> A <- array(runif(400*400*2),dim=c(400,400,2)) 
> system.time(apply(A, c(1,2), prod)); system.time(A[,,1]*A[,,2]) 
    user system elapsed 
    0.448 0.018 0.452 # the apply timings 
    user system elapsed 
    0.005 0.000 0.004 # the vectorised operation 

> A <- array(runif(4000*4000*2),dim=c(4000,4000,2)) 
> system.time(A[,,1]*A[,,2]) 
    user system elapsed 
    0.525 0.096 0.604