【问题标题】:R, select sequence of sub matrix from a high dimensional arrayR,从高维数组中选择子矩阵序列
【发布时间】:2013-05-19 05:42:00
【问题描述】:

A 是一个 4 维数组,尺寸为 100*100*100*100。我想从 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

使用映射:

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 

这甚至更慢。有没有更快的方法来做到这一点?谢谢。

【问题讨论】:

    标签: r multidimensional-array vectorization


    【解决方案1】:

    诀窍是将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
    

    【讨论】:

      猜你喜欢
      • 2013-12-23
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      相关资源
      最近更新 更多