我有一個三維數組(例如尺寸= 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
...其表明應用函數明顯比其他兩種基本類似速度快的方法慢得多。
你應該發佈一個3x3x2數組的例子,並說出正確的答案可能是什麼。如果它只是元素多重,那麼只是'A [,, 1] * A [,, 2]' –