我的问题非常简单,但我似乎无法找到解决方案。 我有一个n维数组A,我想提取n-1维数组B,这要归功于索引C的n-1维数组。 如果没有循环,我怎么能这样做?
例如:
A=array(1:12, dim=c(2,3,2))
A
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
C=array(c(1,2,2,1,1,2),dim=c(2,3))
C
[,1] [,2] [,3]
[1,] 1 2 1
[2,] 2 1 2
最后我想找到B(就像" A [,, C]")
B
[,1] [,2] [,3]
[1,] 1 9 5
[2,] 8 4 12
好像我已经完成了
B
[,1] [,2] [,3]
[1,] A[1,1,C[1,1]] A[1,2,C[1,2] A[1,3,C[1,3]]
[2,] A[2,1,C[2,1]] ...
我必须在5个维度中这样做,所以如果我可以避免制作循环......
感谢。
答案 0 :(得分:4)
我会通过索引计算来解决这个问题:通过将0:(length(C)-1)
添加到A
的每个[。,。,i] -slice(在您的情况下为i = 1,2),您可以得到索引第一片。如果C-1
与C
的长度相乘,然后再添加1
,您还将获得所有其他切片的正确索引。 -1
和+1
操作相互补偿,因此我们可以很快表达出来:
ind <- as.vector((C-1) * length(C) + 1:length(C))
array(A[ind], dim = dim(C))
答案 1 :(得分:3)
另一种解决方案:
B<-A[cbind(c(row(C)),c(col(C)),c(C))]
dim(B)<-dim(C)
答案 2 :(得分:3)
您也可以尝试
library(reshape2)
matrix(A[as.matrix(melt(C))], ncol=ncol(C))
# [,1] [,2] [,3]
#[1,] 1 9 5
#[2,] 8 4 12