【问题标题】:R: extract matrix from array, using a matrix of indicesR:使用索引矩阵从数组中提取矩阵
【发布时间】:2016-09-06 08:43:54
【问题描述】:

我在 R 中编码,我有一个包含数据的 3 维数组(示例中为 ab)。然后我有一个矩阵,其中包含第三个数组维度(idx)的索引。该矩阵具有相同数量的数组行数和列数。我想使用 idx 中包含的索引从数组中提取数据,得到一个与 idx 维度相同的矩阵。请看下面的例子:

a <- c(1:9)
b <- rev(a)

#array of data
ab <- array(c(a,b), dim = c(3,3,2))
ab
, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]    9    6    3
[2,]    8    5    2
[3,]    7    4    1

#matrix of indices
idx <- matrix(sample(1:2,9,replace=TRUE), nrow = 3)
idx
     [,1] [,2] [,3]
[1,]    2    2    2
[2,]    2    1    1
[3,]    1    1    1

#now I want to get the following matrix:
     [,1] [,2] [,3]
[1,]    9    6    3
[2,]    8    5    8
[3,]    3    6    9

#these two don´t do the job
ab[idx]
ab[ , ,idx]

有人知道我怎样才能得到它吗?

非常感谢!

萨拉

【问题讨论】:

    标签: arrays r matrix


    【解决方案1】:

    我们需要行/列的索引和第三维(来自“idx”)来提取元素。我们通过cbinding 行索引、带有“idx”的列索引来做到这一点。

    i1 <- dim(ab)[1]
    j1 <- dim(ab)[2]
    matrix(ab[cbind(rep(seq_len(i1),  j1),rep(seq_len(j1), each = i1), c(idx))], ncol=3)
    #     [,1] [,2] [,3]
    #[1,]    9    6    3
    #[2,]    8    5    8
    #[3,]    3    6    9
    

    【讨论】:

      【解决方案2】:

      可能有点复杂,但至少可以: 首先是我的 idx:

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

      首先我把它变成了一个向量:

      idVec <- as.vector(idx)
      d3mat <- apply(ab,3,as.vector)
      

      然后我构造了一个向量,遍历每个元素:

      len <- length(idVec)
      len <- 1:len
      

      然后我对向量 len 的每个元素应用了一个函数:

      resultvec <- sapply(len, function(x, vec, mat){return(mat[x,vec[x]])}, mat=d3mat, vec=idVec)
      

      然后将结果转换回矩阵:

          matrix(resultVec,3,3)
           [,1] [,2] [,3]
      [1,]    9    6    7
      [2,]    2    5    8
      [3,]    7    4    1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-12
        • 1970-01-01
        • 1970-01-01
        • 2015-12-09
        • 1970-01-01
        • 2021-10-14
        相关资源
        最近更新 更多