按行填充数组的R语言实现

7

我想进行一些矩阵操作,最好利用3(或更高)维数组。如果我想按行填充矩阵,可以使用参数(byrow=TRUE),但创建/填充多维数组没有这样的选项。我唯一能做到的是使用aperm来转置按列填充的数组。例如:

arr.1 <- array(1:12, c(3,2,2))

arr.1

arr.2 <- aperm(arr.1, c(2,1,3))

arr.2

生成正确的结果,一个由行填充的2x3x2数组。从列x行x范围数组倒推到行x列x范围数组似乎有点反直觉。这可能是来自以前f77编码的不良习惯,或者我忽略了一些简单的东西?

3个回答

1
如果您想将一个值向量解释为“行优先顺序”(如C中,或更准确地说,最后一个维度变化最快)的n维数组,您可以使用来自包“listarrays”的函数array2()。这是将matrix(..., byrow = TRUE)扩展到多个维度的逻辑扩展。
与基础R进行比较
> (a <- array(1:24, c(2,3,4)))
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

, , 3

     [,1] [,2] [,3]
[1,]   13   15   17
[2,]   14   16   18

, , 4

     [,1] [,2] [,3]
[1,]   19   21   23
[2,]   20   22   24

使用

> library(listarrays)
> (a <- array2(1:24, c(2,3,4)))
, , 1

     [,1] [,2] [,3]
[1,]    1    5    9
[2,]   13   17   21

, , 2

     [,1] [,2] [,3]
[1,]    2    6   10
[2,]   14   18   22

, , 3

     [,1] [,2] [,3]
[1,]    3    7   11
[2,]   15   19   23

, , 4

     [,1] [,2] [,3]
[1,]    4    8   12
[2,]   16   20   24

1
在R中,数组是通过首先遍历第一维来填充的。因此,首先遍历第一维,然后是第二维,如果可用,则遍历第三维。
对于矩阵的情况:
array(c(1,2,3), dim = c(3,3))

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    2    2
[3,]    3    3    3

或者使用赋值语句:

M <- array(dim = c(3,3))
M[,] <- c(1,2,3)
M

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    2    2
[3,]    3    3    3

将值赋给第二维数组很容易:

M <- array(dim = c(3,3))
M[,2:3] <- c(1,2,3)
M

     [,1] [,2] [,3]
[1,]   NA    1    1
[2,]   NA    2    2
[3,]   NA    3    3

但是对于第一维的赋值比较棘手。以下代码并不能得到预期结果:

M <- array(dim = c(3,3))
M[2:3,] <- c(1,2,3)
M

     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]    1    3    2
[3,]    2    1    3

首先遍历第一维,然后是第二维填充数据。我们希望先遍历第二维,然后是第一维。因此,我们需要使用aperm函数对数组进行转置(或在矩阵的情况下进行转置)。

M <- array(dim = c(3,3))
Mt <- aperm(M)
Mt[,2:3] <- c(1,2,3)
M <- aperm(Mt)
M

     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]    1    2    3
[3,]    1    2    3

也许有更优雅的方法来完成最后一步,但我并不知道。

这个解决方案适用于二维矩阵。然而,对于三维数组,如果维度大小不相等(例如3 x 2 4 x 5),维度的排列顺序不能替换所需位置上的项。 - Denis Cousineau

-1

我建议你通过运行以下代码,"自学"默认顺序:

foo <- array(1:60, 3, 4, 5) 然后,你可以通过重新排列源向量或创建矩阵并按所需顺序加载到数组的 z 层中来填充任意数组。


这并不是真正的回答,而是呼吁更改原始问题... - Denis Cousineau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接