R索引数组.如何使用第三维矩阵索引3维数组

Ato*_*ter 3 r multidimensional-array matrix-indexing

我有一个关于索引3个暗淡数组的问题.

说我有一个三维数组

x<- c(1:36)
dim(x) <- c(3,4,3) 
Run Code Online (Sandbox Code Playgroud)

现在我想根据包含所有[i,j]位置的第三维索引的矩阵从该数组中提取值.

y <- c(rep(1,4),rep(2,4),rep(3,4))
dim(y) <- c(3,4)

y
      [,1] [,2] [,3] [,4]
[1,]    1    1    2    3
[2,]    1    2    2    3
[3,]    1    2    3    3
Run Code Online (Sandbox Code Playgroud)

所以结果应该是这样的:

     [,1] [,2] [,3] [,4]
[1,]    1    4   19   34
[2,]    2   17   20   35
[3,]    3   18   33   36
Run Code Online (Sandbox Code Playgroud)

有一些优雅的方式来做到这一点?我知道如何使用两个for循环遍历数组,但这对我的数据来说太慢了.

Rol*_*and 6

help("[") 告诉我们这个:

矩阵和数组

[...]

第三种形式的索引是通过数字矩阵,每个维度有一列:索引矩阵的每一行然后选择数组的单个元素,结果是一个向量.

因此,我们将y矩阵转换为符合此要求的形状.

library(reshape2)
z <- x[as.matrix(melt(y))]
dim(z) <- dim(y)
#     [,1] [,2] [,3] [,4]
#[1,]    1    4   19   34
#[2,]    2   17   20   35
#[3,]    3   18   33   36
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 5

我将此视为进行一些代码高尔夫的机会。绝对可以将其作为单行来执行:

> `dim<-`(x[cbind(c(row(y)), c(col(y)), c(y))], dim(y))
     [,1] [,2] [,3] [,4]
[1,]    1    4   19   34
[2,]    2   17   20   35
[3,]    3   18   33   36
Run Code Online (Sandbox Code Playgroud)

正如@Roland 的回答所示,矩阵/数组索引涉及创建一个n列矩阵并将列设置为等于n维数组每个维度的行、列等位置。我们可以使用row()col()函数来提取 中每个元素的行和列位置y

> row(y)
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    2    2    2    2
[3,]    3    3    3    3
> col(y)
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    2    3    4
[3,]    1    2    3    4
Run Code Online (Sandbox Code Playgroud)

并且y本身给出了第三维位置。将它们中的每一个包裹起来c()将它们变成一个向量,这样它们就可以cbind组合在一起以创建一个提取矩阵。

然后,有一些有趣的用法dim<-()可以将所有内容放在一行中。