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循环遍历数组,但这对我的数据来说太慢了.
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)
我将此视为进行一些代码高尔夫的机会。绝对可以将其作为单行来执行:
> `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<-()可以将所有内容放在一行中。