Re: How to unflatten an array ?
- To: mathgroup at smc.vnet.net
- Subject: [mg112832] Re: How to unflatten an array ?
- From: Sseziwa Mukasa <mukasa at jeol.com>
- Date: Sat, 2 Oct 2010 05:45:45 -0400 (EDT)
Here's a faster approach: In[63]:= First[Timing[ Partition[ArrayFlatten[{{Transpose[{a4[[All, ;; 2]]}], a4[[All, {3}]]}}], 3];]] Out[63]= 0.118238 On Oct 1, 2010, at 5:43 AM, Sseziwa Mukasa wrote: > > On Sep 30, 2010, at 4:52 AM, Valeri Astanoff wrote: > >> 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. > > I would construct the desired result as: > > Partition[{Most[#],Last[#]}&/@a2,3] > > Comparing on a array of 10002 triples the timing of the two algorithms is > > (Debug) In[244]:= a4 = RandomInteger[{-10, 10}, {100002, 3}]; > First[Timing[unflatten[a4];]] > First[Timing[Partition[{Most[#], Last[#]} & /@ a4, 3];]] > (Debug) Out[245]= 1.39615 > (Debug) Out[246]= 0.549411 > > Regards, > Sseziwa >