私が配列を持っているとしましょう
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 およびk1 から 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)),]
これは2次元で機能します
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)),]いますか? 多分私はいくつかの構文糖衣を欠いている...