【问题标题】:R filling array by rowsR按行填充数组
【发布时间】:2014-05-01 13:58:38
【问题描述】:

我想做一些矩阵运算,最好使用 3(或更高)维数组。如果我想按行填充 矩阵 有一个参数 (byrow = TRUE) 但是没有这样的选项来创建/填充多维 array。我能够完成它的唯一方法是使用 aperm 转置按列填充的数组。例如:

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

arr.1

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

arr.2

产生正确的结果,即按行填充的 2、3、2 维数组。必须从 Column x Row x Range 数组向后工作以到达 Row x Column x Range 数组,这似乎有点违反直觉。这可能是以前 f77 编码的坏习惯,还是我忽略了一些简单的事情?

【问题讨论】:

    标签: arrays r


    【解决方案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
    

    也许有更优雅的方式来做我不知道的最后一个。

    【讨论】:

      【解决方案2】:

      我的建议是通过运行“教”自己默认顺序

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-20
        • 1970-01-01
        相关资源
        最近更新 更多