我用R编码,我有一个包含数据的三维数组(在这个例子中是ab)。然后我有一个矩阵,它包含第三个数组维数(idx)的索引。该矩阵具有相同数量的数组的行数和列数。我想使用idx中包含的索引从数组中提取数据,以获得与idx维度相同的矩阵。请参考下面的示例:
a <- c(1:9)
b <- rev(a)
#array of data
ab <- array(c(a,b), dim = c(3,3,2))
ab
, , 1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
, , 2
[,1] [,2] [,3]
[1,] 9 6 3
[2,] 8 5 2
[3,] 7 4 1
#matrix of indices
idx <- matrix(sample(1:2,9,replace=TRUE), nrow = 3)
idx
[,1] [,2] [,3]
[1,] 2 2 2
[2,] 2 1 1
[3,] 1 1 1
#now I want to get the following matrix:
[,1] [,2] [,3]
[1,] 9 6 3
[2,] 8 5 8
[3,] 3 6 9
#these two don´t do the job
ab[idx]
ab[ , ,idx]
有谁知道我怎么才能做到这一点?
非常感谢!
萨拉
发布于 2016-09-06 16:57:33
我们需要一个行/列的索引和第三个维度(来自'idx')来提取元素。我们通过使用'idx‘对行索引和列索引进行cbind
来实现这一点。
i1 <- dim(ab)[1]
j1 <- dim(ab)[2]
matrix(ab[cbind(rep(seq_len(i1), j1),rep(seq_len(j1), each = i1), c(idx))], ncol=3)
# [,1] [,2] [,3]
#[1,] 9 6 3
#[2,] 8 5 8
#[3,] 3 6 9
发布于 2016-09-06 17:10:27
可能有点复杂,但至少可以工作:首先是我的idx:
[,1] [,2] [,3]
[1,] 2 2 1
[2,] 1 2 1
[3,] 2 2 2
首先,我将两者都转换为一个向量:
idVec <- as.vector(idx)
d3mat <- apply(ab,3,as.vector)
然后我构造了一个向量,用来遍历每个元素:
len <- length(idVec)
len <- 1:len
然后,我将一个函数应用于向量len的每个元素:
resultvec <- sapply(len, function(x, vec, mat){return(mat[x,vec[x]])}, mat=d3mat, vec=idVec)
然后将结果转换回矩阵:
matrix(resultVec,3,3)
[,1] [,2] [,3]
[1,] 9 6 7
[2,] 2 5 8
[3,] 7 4 1
https://stackoverflow.com/questions/39344473
复制相似问题