如何通过n-1维数组和没有循环从n维数组中提取n-1维数组?

时间:2015-03-11 10:18:19

标签: arrays r multidimensional-array

我的问题非常简单,但我似乎无法找到解决方案。 我有一个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个维度中这样做,所以如果我可以避免制作循环......

感谢。

3 个答案:

答案 0 :(得分:4)

我会通过索引计算来解决这个问题:通过将0:(length(C)-1)添加到A的每个[。,。,i] -slice(在您的情况下为i = 1,2),您可以得到索引第一片。如果C-1C的长度相乘,然后再添加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