如何从n维数组中通过一个n-1维数组提取n-1维数组,而不需要使用循环?

3
我的问题非常简单,但我似乎找不到解决方案。 我有一个n维数组A,我想通过一个n-1维的索引数组C提取n-1维数组B。 如何做到这一点,而不需要循环?
例如:
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]]   ...

我需要在五个维度上完成这个任务,如果能避免使用循环就最好不过了...

谢谢。


没有人能帮我吗? - sandikou
我不明白你是如何得到 B 的。能否请您详细说明一下? - nicola
当然,C是沿第三维要取的索引数组。例如,B[1,1] = A[1,1, C[1,1]]。 - sandikou
3个回答

4

我会通过索引计算来解决这个问题:将A的每个[.,.,i]切片(i=1,2在你的情况下)加上0:(length(C)-1),即可得到第一个切片的索引。如果先将C-1C的长度相乘,然后再加上1,就可以得到所有其他切片的正确索引。-1+1操作互相抵消,因此我们可以非常简洁地表达这个过程。

ind <- as.vector((C-1) * length(C) + 1:length(C))
array(A[ind], dim = dim(C))

谢谢,但如果我的问题是在5个维度中,需要提取的是第四个维度,我应该使用什么? - sandikou

3
另一个解决方案:
B<-A[cbind(c(row(C)),c(col(C)),c(C))]
dim(B)<-dim(C)

3
您也可以尝试:
library(reshape2)
matrix(A[as.matrix(melt(C))], ncol=ncol(C))
#      [,1] [,2] [,3]
#[1,]    1    9    5
#[2,]    8    4   12

“melt”函数完美地满足了我的需求。谢谢! - sandikou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接