【问题标题】:Using a 2D array as an index to a 3D array使用 2D 数组作为 3D 数组的索引
【发布时间】:2018-11-13 11:04:57
【问题描述】:

我在 R 中有一个三维数组,例如

a <- array(1:24, dim=c(2,3,4))

我将把这个数组的维度称为行、列和层。 我有第二个变量 b,它旨在为该数组提供索引,例如

b <- array(c(1,4,3,2,2,1), dim=c(2,3))

我想得到一个二维变量 d,它包含 b 指定的层中的 3D 变量 a 的值ab 中的每一行和每一列。例如,d[1, 1] &lt;- a[1, 1 , b[1, 1]]d[2, 3] &lt;- a[2, 3, b[2, 3]] 等等。在这个例子中,我应该得到:

 d == array(c(1, 20, 15, 10, 11, 6), dim=c(2, 3))

最有效的方法是什么?

【问题讨论】:

    标签: arrays r multidimensional-array slice


    【解决方案1】:

    最快的方法:

    structure(a[cbind(c(row(b)),c(col(b)),c(b))],.Dim=dim(b))
         [,1] [,2] [,3]
    [1,]    1   15   11
    [2,]   20   10    6
    

    【讨论】:

      【解决方案2】:

      我建议也使用expand.grid,但我会生成一个索引矩阵来一次性处理a 的每个条目。

      ind <- as.matrix(expand.grid(1:nrow(b), 1:ncol(b)))
      d <- matrix(a[cbind(ind, b[ind])], ncol = ncol(b), nrow = nrow(b))
      

      我认为这稍微更有效率

      【讨论】:

        【解决方案3】:

        我们可以使用expand.grid获取b中所有行和列的组合,然后使用mapply使用索引从a获取相应的输出。我们使用relist 使d 矩阵与b 相同。

        df <- expand.grid(row = 1:nrow(b), col = 1:ncol(b))
        d <- relist(mapply(function(x, y) a[x, y, b[x, y]], df$row, df$col), b)
        d
        
        #     [,1] [,2] [,3]
        #[1,]    1   15   11
        #[2,]   20   10    6
        

        df 在哪里

           row col
        #1   1   1
        #2   2   1
        #3   1   2
        #4   2   2
        #5   1   3
        #6   2   3
        

        【讨论】:

          猜你喜欢
          • 2019-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-30
          • 2021-08-05
          • 2015-08-11
          • 1970-01-01
          • 2020-06-04
          相关资源
          最近更新 更多