R,从高维数组中选择子矩阵序列

时间:2013-05-23 18:16:57

标签: r multidimensional-array vectorization

A是具有暗淡100 * 100 * 100 * 100的4维阵列。我想从A的最后两个维度中选择10000个子矩阵。 B和C是长度为10000的向量。它们是选择标准。 B指定A的行号,C指定列号。

A <- array(rnorm(100^4), dim=c(100,100,100,100))
B <- sample( nrow(A) , 10000 , repl = TRUE )
C <- sample( ncol(A) , 10000 , repl = TRUE )
D <- array(0, dim=c(10000,100,100))

使用for循环:

system.time(
 for ( i in 1:10000 ){    
     D[i,,] <- A[B[i],C[i],,]
 }) 

user  system elapsed 
10.20    0.14   10.34

与mapply:

sub_array <- function(b,c) return(A[b,c,,])
system.time(D <- mapply(FUN = sub_array, B, C, SIMPLIFY='array'))

user  system elapsed 
9.77    3.75   29.17 

甚至更慢。有更快的方法吗?谢谢。

1 个答案:

答案 0 :(得分:2)

诀窍是将A重新调整为3D数组,以便您可以使用我们称之为“正常”的索引。

一些示例数据:

n <- 60
A <- array(rnorm(n^4), dim=c(n,n,n,n))
B <- sample( nrow(A) , n^2 , repl = TRUE )
C <- sample( ncol(A) , n^2 , repl = TRUE )
D <- array(0, dim=c(n^2,n,n))

OP的方法:

system.time({
  D <- array(0, dim=c(n*n, n, n))
  for ( i in 1:(n*n) ) D[i,,] <- A[B[i],C[i],,]
}) 
#    user  system elapsed 
#    2.33    0.08    2.41 

建议的解决方案:

system.time({
  d <- dim(A)
  dim(A) <- c(prod(d[1:2]), d[3:4])
  D2 <- A[B + d[1]*(C-1),,]
})
#    user  system elapsed 
#    0.37    0.06    0.44 

我们检查结果是否相同:

identical(D, D2)
# [1] TRUE