i'm somehow embarrassed to even ask this, but is there any built-in method for doing this: my_list <- list() my_list[[1]] <- matrix(1:20, ncol = 5) my_list[[2]] <- matrix(20:1, ncol = 5) now, knowing that these matrices are identical in dimension, i'd like to unfold the list to a 2x4x5 (or some other permutation of the dim sizes) array. i know i can initialize the array, then loop through my_list to fill the array, but somehow this seems inelegant. i also know i can vectorize the matrices and unlist the list, then build the array from that single vector, but this also seems inelegant (and an easy place to introduce errors/bugs). i can't seem to find any built-in that handles this already... but maybe i just haven't looked hard enough :-/ cheers, -m
FYI - this is my current method, but somehow i just don't like it ;-) foo <- array(NA, dim = c(4,5,length(my_list))) for(k in 1:length(my_list)) { foo[,,k] <- my_list[[k]] } -m On Thu, Feb 14, 2013 at 1:03 AM, Murat Tasan <mmuurr at gmail.com> wrote:> i'm somehow embarrassed to even ask this, but is there any built-in > method for doing this: > > my_list <- list() > my_list[[1]] <- matrix(1:20, ncol = 5) > my_list[[2]] <- matrix(20:1, ncol = 5) > > now, knowing that these matrices are identical in dimension, i'd like > to unfold the list to a 2x4x5 (or some other permutation of the dim > sizes) array. > i know i can initialize the array, then loop through my_list to fill > the array, but somehow this seems inelegant. > i also know i can vectorize the matrices and unlist the list, then > build the array from that single vector, but this also seems inelegant > (and an easy place to introduce errors/bugs). > > i can't seem to find any built-in that handles this already... but > maybe i just haven't looked hard enough :-/ > > cheers, > > -m
require(abind) do.call(abind,c(my_list,list(along=0))) # Gives 2 x 4 x 5 do.call(abind,c(my_list,list(along=3))) # Gives 4 x 5 x 2 The latter seems more natural to me. cheers, Rolf Turner On 02/14/2013 07:03 PM, Murat Tasan wrote:> i'm somehow embarrassed to even ask this, but is there any built-in > method for doing this: > > my_list <- list() > my_list[[1]] <- matrix(1:20, ncol = 5) > my_list[[2]] <- matrix(20:1, ncol = 5) > > now, knowing that these matrices are identical in dimension, i'd like > to unfold the list to a 2x4x5 (or some other permutation of the dim > sizes) array. > i know i can initialize the array, then loop through my_list to fill > the array, but somehow this seems inelegant. > i also know i can vectorize the matrices and unlist the list, then > build the array from that single vector, but this also seems inelegant > (and an easy place to introduce errors/bugs). > > i can't seem to find any built-in that handles this already... but > maybe i just haven't looked hard enough :-/
On Feb 13, 2013, at 10:03 PM, Murat Tasan wrote:> i'm somehow embarrassed to even ask this, but is there any built-in > method for doing this: > > my_list <- list() > my_list[[1]] <- matrix(1:20, ncol = 5) > my_list[[2]] <- matrix(20:1, ncol = 5) > > now, knowing that these matrices are identical in dimension, i'd like > to unfold the list to a 2x4x5 (or some other permutation of the dim > sizes) array. > i know i can initialize the array, then loop through my_list to fill > the array, but somehow this seems inelegant. > i also know i can vectorize the matrices and unlist the list, then > build the array from that single vector, but this also seems inelegant > (and an easy place to introduce errors/bugs). > > i can't seem to find any built-in that handles this already... but > maybe i just haven't looked hard enough :-/I think the built-in function you seek is `simplify2array`: # gives 4 x 5 x 2 > simplify2array(my_list) , , 1 [,1] [,2] [,3] [,4] [,5] [1,] 1 5 9 13 17 [2,] 2 6 10 14 18 [3,] 3 7 11 15 19 [4,] 4 8 12 16 20 , , 2 [,1] [,2] [,3] [,4] [,5] [1,] 20 16 12 8 4 [2,] 19 15 11 7 3 [3,] 18 14 10 6 2 [4,] 17 13 9 5 1 > # 2 x 4 x 5 aperm( simplify2array(my_list), c(3,1,2) ) # 4 x 2 x 5 > aperm( simplify2array(my_list), c(1,3,2) ) -- David Winsemius, MD Alameda, CA, USA