Irregular array subsetting in R -


let's have array

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

in following refer testarray[i,,], testarray[,j,] , testarray[,,k] x=i, y=j , z=k subsets, respectively. in specific example, indices i , j can go 1 3 , k 1 4.

now, want subset 3 dimensional array x=y subset. output should be

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

i have (naively) thought such operation should possible by

library(matrix) testarray[as.array(diagonal(3,true)),] 

this works in 2 dimensions

matrix(1:9,3,3)[as.matrix(diagonal(3,true))] 

however, in 3 dimensions gives error.

i know produce index array

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

and access elements by

matrix(testarray[indexarray],nrow=4,ncol=3,byrow=true) 

but first method nicer , need less memory well. know how fix testarray[as.array(diagonal(3,true)),] works desired? maybe missing syntactic sugar...

i don't know if abind::asub (you) want. uses more efficient form of matrix indexing have above, still have coerce results right shape ...

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

slightly more generally:

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) 

Comments

Popular posts from this blog

php - Calling a template part from a post -

Firefox SVG shape not printing when it has stroke -

How to mention the localhost in android -