使用2D数组作为3D数组的索引

时间:2018-06-04 07:07:11

标签: arrays r multidimensional-array slice

我在R中有一个三维数组,例如

a <- array(1:24, dim=c(2,3,4))

我将这个数组的维度称为行,列和层。 我有第二个变量 b ,用于为该数组提供索引,例如

b <- array(c(1,4,3,2,2,1), dim=c(2,3))

我想获得一个二维变量 d ,其中包含 b 指定的图层中3D变量 a 的值对于 a b 中的每一行和每列。例如,d[1, 1] <- a[1, 1 , b[1, 1]]d[2, 3] <- a[2, 3, b[2, 3]]等等。在这个例子中,我最终应该:

 d == array(c(1, 20, 15, 10, 11, 6), dim=c(2, 3))

最有效的方法是什么?

3 个答案:

答案 0 :(得分:2)

你能做到这一点的最快方法:

structure(a[cbind(c(row(b)),c(col(b)),c(b))],.Dim=dim(b))
     [,1] [,2] [,3]
[1,]    1   15   11
[2,]   20   10    6

答案 1 :(得分:1)

我们可以使用expand.grid获取b中所有行和列的组合,然后使用mapply使用索引从a获取相应的输出。我们使用relist使d矩阵与b相同。

df <- expand.grid(row = 1:nrow(b), col = 1:ncol(b))
d <- relist(mapply(function(x, y) a[x, y, b[x, y]], df$row, df$col), b)
d

#     [,1] [,2] [,3]
#[1,]    1   15   11
#[2,]   20   10    6

其中df

   row col
#1   1   1
#2   2   1
#3   1   2
#4   2   2
#5   1   3
#6   2   3

答案 2 :(得分:1)

我建议同时使用float **values,但我会生成一个索引矩阵,以便同时对expand.grid的每个条目进行地址处理。

a

我认为稍微更有效