I'll assume your list of 2D examples, this can easily be extended to arbitrary dimensions, and for that matter to a list with elements of differing depths. On a quick test using
Table[RandomInteger[100, {RandomInteger[{50, 100}], RandomInteger[{50, 100}]}], {2000}];
to generate 2000 randomly sized 2D arrays, over 30X faster than reco
:
ranger[list_, lens_] := With[{x = Accumulate@lens},
Inner[list[[# ;; #2]] &, Most@Prepend[x, 0] + 1, x, List]]
Use example:
test = {RandomReal[10, {2, 3}], RandomReal[20, {5, 5}]};
dims = {{3, 3, 5, 5, 5, 5, 5}, {2, 5}};
target = Flatten[test];
Fold[ranger, target, dims] == test
(* True *)
Note the "dimensions" argument is specified from the "bottom" up, per construction element. This allows, among other things, the targets themselves to be ragged.
Btw- ranger
is simply a ragged partitioner I built long ago: given a flat list and a list of lengths, it returns the original list partitioned by the lengths. IIRC, faster than the (undocumented) built-in.