【发布时间】:2016-01-15 09:19:18
【问题描述】:
我有一个三维数组(例如维度 = 4000 x 4000 x 2)。现在我想计算第三维的乘积以获得二维数组(维度 = 4000 x 4000)作为结果。
我尝试在apply() 函数中使用prod() 计算乘积;但是,这非常耗时。因此,我想知道是否有更快更有效的方法来进行此类计算?
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
...这表明 apply 函数明显慢于其他两种基本上同样快的方法。
【问题讨论】:
-
您应该发布一个 3x3x2 数组的示例,并说出正确的答案可能是什么。如果它只是按元素 mult,那么只需
A[,,1]*A[,,2]
标签: arrays r performance multidimensional-array multiplication