从三维数组中的行形成矩阵

问题描述:

我有X,一个R中的三维数组我想要一个指数为indx(长度等于dim(X)[1])的矢量,并形成一个矩阵,其中第一行是第一行行X[ , , indx[1]],第二行是X[ , , indx[2]]的第二行,以此类推。从三维数组中的行形成矩阵

例如,我有:

R> X <- array(1:18, dim = c(3, 2, 3)) 
R> X 
, , 1 

    [,1] [,2] 
[1,] 1 4 
[2,] 2 5 
[3,] 3 6 

, , 2 

    [,1] [,2] 
[1,] 7 10 
[2,] 8 11 
[3,] 9 12 

, , 3 

    [,1] [,2] 
[1,] 13 16 
[2,] 14 17 
[3,] 15 18 

R> indx <- c(2, 3, 1) 

我的期望的输出是

R> rbind(X[1, , 2], X[2, , 3], X[3, , 1]) 
    [,1] [,2] 
[1,] 7 10 
[2,] 14 17 
[3,] 3 6 

截至目前我使用的不雅(和慢)sapply(1:dim(X)[2], function(x) X[cbind(1:3, x, indx)])。有没有办法使用内置的索引功能来做到这一点?我没有运用?Extract中描述的矩阵索引方法进行实验,但我可能只是做错了。

+0

相关:http://stackoverflow.com/q/3551955/210673 – Aaron 2011-06-07 18:56:11

也许是这样的:

t(sapply(1:3,function(x) X[,,idx][x,,x])) 

我可以回答错误的问题(我无法调和你的第一个描述和您的样品输出)...这将产生你的样本输出,但我不能说它没有在你的数据上运行它要快得多。

do.call(rbind, lapply(1:dim(X)[1], function(i) X[i, , indx[i]]))

矩阵索引来救援!没有apply需要。

找出你想要哪个索引:

n <- dim(X)[2] 
foo <- cbind(rep(seq_along(indx),n), 
      rep(seq.int(n), each=length(indx)), 
      rep(indx,n)) 

(结果是这样的)

 [,1] [,2] [,3] 
[1,] 1 1 2 
[2,] 2 1 3 
[3,] 3 1 1 
[4,] 1 2 2 
[5,] 2 2 3 
[6,] 3 2 1 

,并以此为指标,转换回一个矩阵,使它看起来像你的输出。

> matrix(X[foo],ncol=n) 
    [,1] [,2] 
[1,] 7 10 
[2,] 14 17 
[3,] 3 6