从三维数组中的行形成矩阵
问题描述:
我有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
中描述的矩阵索引方法进行实验,但我可能只是做错了。
答
也许是这样的:
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
相关:http://stackoverflow.com/q/3551955/210673 – Aaron 2011-06-07 18:56:11