将 R 3D 数组转换为堆叠矩阵
Convert R 3D array to stacked matrix
我有一个 3D R 阵列,例如:
a <- array(1:27, dim = c(3,3,3))
我如何(有效地)将其转换为一个矩阵,其中第 3 维相互绑定/堆叠,即:
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
[4,] 10 13 16
[5,] 11 14 17
[6,] 12 15 18
[7,] 19 22 25
[8,] 20 23 26
[9,] 21 24 27
我可以笨拙地实现这一目标:
rbind(a[,,1], a[,,2], a[,,3])
但是如果我在第 3 维中有很多条目(循环除外),则这不能很好地概括。
必须有一种更优雅的方法来实现这一点,但我找不到。
apply(a, 3, rbind)
apply(a, 3, c)
创建一个矩阵,但第 3 维只是变成了列。我想保留前二维的二维矩阵并将它们绑定在一起。我知道这会弄乱索引,但我们可以在我的用例中忽略它。
我会对基本的 R 解决方案感到特别高兴,但如果这可以通过(轻量级)包实现,我也很感兴趣。
编辑:
This answer to a seemingly unrelated question 提供了有用的提示。这种方法似乎达到了预期的效果:
matrix(aperm(a, c(1, 3, 2)), nrow = dim(a)[1] * dim(a)[3])
还有其他想法吗?
在 aperm
中,我们通过排列数组的维度并根据需要调整其大小来转置数组:
y <- aperm(a, c(1, 3, 2))
dim(y) <- c(prod(dim(a)[-2]), dim(a)[2])
y
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
[4,] 10 13 16
[5,] 11 14 17
[6,] 12 15 18
[7,] 19 22 25
[8,] 20 23 26
[9,] 21 24 27
我有一个 3D R 阵列,例如:
a <- array(1:27, dim = c(3,3,3))
我如何(有效地)将其转换为一个矩阵,其中第 3 维相互绑定/堆叠,即:
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
[4,] 10 13 16
[5,] 11 14 17
[6,] 12 15 18
[7,] 19 22 25
[8,] 20 23 26
[9,] 21 24 27
我可以笨拙地实现这一目标:
rbind(a[,,1], a[,,2], a[,,3])
但是如果我在第 3 维中有很多条目(循环除外),则这不能很好地概括。
必须有一种更优雅的方法来实现这一点,但我找不到。
apply(a, 3, rbind)
apply(a, 3, c)
创建一个矩阵,但第 3 维只是变成了列。我想保留前二维的二维矩阵并将它们绑定在一起。我知道这会弄乱索引,但我们可以在我的用例中忽略它。
我会对基本的 R 解决方案感到特别高兴,但如果这可以通过(轻量级)包实现,我也很感兴趣。
编辑: This answer to a seemingly unrelated question 提供了有用的提示。这种方法似乎达到了预期的效果:
matrix(aperm(a, c(1, 3, 2)), nrow = dim(a)[1] * dim(a)[3])
还有其他想法吗?
在 aperm
中,我们通过排列数组的维度并根据需要调整其大小来转置数组:
y <- aperm(a, c(1, 3, 2))
dim(y) <- c(prod(dim(a)[-2]), dim(a)[2])
y
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
[4,] 10 13 16
[5,] 11 14 17
[6,] 12 15 18
[7,] 19 22 25
[8,] 20 23 26
[9,] 21 24 27