将 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