MathGroup Archive 2010

[Date Index] [Thread Index] [Author Index]

Search the Archive

How to unflatten an array ?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg112786] How to unflatten an array ?
  • From: Valeri Astanoff <astanoff at gmail.com>
  • Date: Thu, 30 Sep 2010 04:52:49 -0400 (EDT)

Good day,

Suppose I have a flat array like this :

{{1, 0, 1}, {1, 1, 1}, {1, 2, 3}, {2, 0, 5}...

and I want to get back to this "unflattened" form :

{{{{1, 0}, 1}, {{1, 1}, 1}, {{1, 2}, 3}}, {{{2, 0}, 5}...

What is the most efficient way to do it ?


All I have found is this :

In[1]:= unflatten[arr : {{_, _, _} ..}] :=
 Module[{f},
 Scan[(f[#[[1]], #[[2]]] = #[[3]]) &, arr];
 Table[{{x, y}, f[x, y]},
 {x, arr[[All, 1]] // Union},
 {y, arr[[All, 2]] // Union}]
 ];

In[2]:= a1 = {{{{1, 0}, 1}, {{1, 1}, 1}, {{1, 2}, 3}},
{{{2, 0}, 5}, {{2, 1}, 0}, {{2, 2}, 0}}, {{{3, 0}, 4},
{{3, 1}, 5}, {{3, 2}, 2}}, {{{5, 0}, 1}, {{5, 1}, 3},
{{5, 2}, 2}}};

In[3]:= a2 = Flatten /@ Flatten[a1, 1]

Out[3]= {{1, 0, 1}, {1, 1, 1}, {1, 2, 3}, {2, 0, 5},
{2, 1, 0}, {2, 2, 0}, {3, 0, 4}, {3, 1, 5}, {3, 2, 2},
{5, 0, 1}, {5, 1, 3}, {5, 2, 2}}

In[4]:= a3 = unflatten@a2

Out[4]= {{{{1, 0}, 1}, {{1, 1}, 1}, {{1, 2}, 3}},
{{{2, 0}, 5}, {{2, 1}, 0}, {{2, 2}, 0}}, {{{3, 0}, 4},
{{3, 1}, 5}, {{3, 2}, 2}}, {{{5, 0}, 1}, {{5, 1}, 3},
{{5, 2}, 2}}}

In[5]:= a1 == a3

Out[5]= True


Please help me to something faster for large arrays.

--
Valeri Astanoff


  • Prev by Date: Re: Convert function from polar to Cartesian
  • Next by Date: Re: Poisson's integral formula doesn't work
  • Previous by thread: 4 Gb are not enough ...
  • Next by thread: Re: Root Finding Methods Gaurenteed to Find All Root