【发布时间】:2013-07-17 17:48:18
【问题描述】:
假设我有数组
TestArray=array(1:(3*3*4),c(3,3,4))
在下文中,我将分别将TestArray[i,,]、TestArray[,j,] 和TestArray[,,k] 称为x=i、y=j 和z=k 子集。在此特定示例中,索引 i 和 j 可以从 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.index和asub的建议。我还不知道这些功能。但是,他们似乎没有完成我上面概述的任务。 -
顺便说一句:我认为“不规则子集”比标题中的“子集”更合适。我已经相应地改变了。