【问题标题】:Irregular array subsetting in RR中的不规则数组子集
【发布时间】:2013-07-17 17:48:18
【问题描述】:

假设我有数组

TestArray=array(1:(3*3*4),c(3,3,4))

在下文中,我将分别将TestArray[i,,]TestArray[,j,]TestArray[,,k] 称为x=iy=jz=k 子集。在此特定示例中,索引 ij 可以从 1 变为 3,k 从 1 变为 4。

现在,我想对这个 3 维数组进行子集化,以便得到 x=y 子集。输出应该是

do.call("cbind",
        list(TestArray[1,1,,drop=FALSE],
             TestArray[2,2,,drop=FALSE],
             TestArray[3,3,,drop=FALSE]
            )
        )

我(天真地)认为这样的操作应该是可能的

library(Matrix)
TestArray[as.array(Diagonal(3,TRUE)),]

这适用于二维

matrix(1:9,3,3)[as.matrix(Diagonal(3,TRUE))]

但是,在 3 维中它会给出错误。

我知道我可以生成一个索引数组

IndexArray=outer(diag(1,3,3),c(1,1,1,1),"*")
mode(IndexArray)="logical"

并通过

访问元素
matrix(TestArray[IndexArray],nrow=4,ncol=3,byrow=TRUE)

但第一种方法会更好,并且需要更少的内存。你知道我如何修复TestArray[as.array(Diagonal(3,TRUE)),] 使其按需要工作吗?也许我只是缺少一些语法糖......

【问题讨论】:

  • ?slice.index 会有帮助吗?
  • 基于 stackoverflow.com/questions/16607232/… ,也许 abind::asub 是你想要的。
  • 感谢您对slice.indexasub 的建议。我还不知道这些功能。但是,他们似乎没有完成我上面概述的任务。
  • 顺便说一句:我认为“不规则子集”比标题中的“子集”更合适。我已经相应地改变了。

标签: arrays r subset


【解决方案1】:

我不知道abind::asub 是否会做我(你)想要的。这使用了比上面更有效的矩阵索引形式,但我仍然必须将结果强制转换为正确的形状......

indmat <- cbind(1:3,as.matrix(expand.grid(1:3,1:4)))
matrix(TestArray[indmat],nrow=4,ncol=3,byrow=TRUE)

更笼统地说:

d <- dim(TestArray)[1]
d2 <- dim(TestArray)[3]
indmat <- cbind(1:d,as.matrix(expand.grid(1:d,1:d2))
matrix(TestArray[indmat],nrow=d2,ncol=d,byrow=TRUE)

【讨论】:

  • 确实,您的索引效率更高。谢谢您的建议。看起来,没有办法按照我原来的帖子中描述的那样去做。
【解决方案2】:

除了 Ben 的回答之外,这里对我的原始代码行进行了令人惊讶的简单修改。

matrix(TestArray[as.matrix(Diagonal(3,TRUE))],ncol=3,nrow=4,byrow=TRUE)

这是因为 as.matrix(Diagonal(3,TRUE)) 被回收了。

【讨论】:

  • 您可以将as.matrix(Diagonal(3, TRUE))替换为基本R代码:as.logical(diag(3))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
相关资源
最近更新 更多