【问题标题】:Subset matrix with arrays in rr 中具有数组的子集矩阵
【发布时间】:2016-12-29 17:27:20
【问题描述】:

这可能是相当基本的,但我还没有找到一个简单的解决方案。

假设我有一个三维矩阵:

m <- array(seq_len(18),dim=c(3,3,2))

我想用索引数组对矩阵进行子集化:

idxrows <- c(1,2,3)
idxcols <- c(1,1,2)

获取位置(1,1),(2,1)和(3,2)的数组,即:

       [,1] [,2] [,3]
[1,]    1    5    9
[2,]   10   14   18

我尝试过m[idxrows,idxcols,],但没有任何运气。

有没有办法(显然不使用 for 循环)?

【问题讨论】:

  • 可以说使用循环,至少对于快速应用也是一种选择,并且易于概括:x &lt;- integer(0L)for (i in 1:length(idxrows)) {x[i] &lt;- m[idxrows[i], idxcols[i]]}
  • 结果和使用一样:cbind(m[idxrows[1],idxcols[1],], m[idxrows[2],idxcols[2],], m[idxrows[3],idxcols[3],])
  • 也许你有错字。 idxcols 应该是 c(1,2,3) 吗?您可以通过 r 绑定数组中 z 维矩阵的对角线来获得所需的输出:rbind(diag(m[,,1]), diag(m[,,2])).
  • mapply 和 lapply 都是循环,但是对于不同的声音sapply(seq_along(idxrows), function(i) m[idxrows[i], idxcols[i],])

标签: r matrix subset


【解决方案1】:

不确定是否有任何简单的内置 extract 语法,但您可以使用 mapply 解决这个问题:

mapply(function(i, j) m[i,j,], idxrows, idxcols)

#     [,1] [,2] [,3]
#[1,]    1    2    6
#[2,]   10   11   15

或者稍微复杂一些,创建一个索引矩阵,其列与原始数组的维度匹配:

thirdDim <- dim(m)[3]
index <- cbind(rep(idxrows, each = thirdDim), rep(idxcols, each = thirdDim), 1:thirdDim)
matrix(m[index], nrow = thirdDim)

#     [,1] [,2] [,3]
#[1,]    1    2    6
#[2,]   10   11   15

【讨论】:

    猜你喜欢
    • 2015-11-23
    • 2014-12-04
    • 2020-06-08
    • 1970-01-01
    • 2021-04-13
    • 2013-03-06
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多