假设我有数组
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)),]
以使其按需要工作吗?也许我只是缺少一些语法糖...