Re: Ranks for an array of triplets

*To*: mathgroup at smc.vnet.net*Subject*: [mg87529] Re: Ranks for an array of triplets*From*: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>*Date*: Sat, 12 Apr 2008 06:59:28 -0400 (EDT)*Organization*: The Open University, Milton Keynes, UK*References*: <ftncq8$8a9$1@smc.vnet.net>

Claus wrote: > I can create an array with x,y,z triplets. x,y are on a regularly spaced > raster, z is a RandomReal. > For sorting the array according to the z values, I found two options, > the second of which is significantly faster. > However, my goal is not to sort, but to calculate the rank of the z > value within the triplet. > For example: > original array Ar: {0,0,9.8},{0,1,2.3},{1,1,12.6} > convert to: {0,0,2},{0,1,1},{1,1,3} > â?? 2.3 is the smallest z-value, hence it gets assigned rank 1 > > In my case I can reach this converted array only with extra steps: > - separating the z-values from Ar, > - calculating the (standardized) "RanksOfAr", > - "gluing" the triplets back together. > > Is there a way to to this in one step? The following should do it. myRank[lst_List] := Module[ {ar = lst}, ar[[All, 3]] = Ordering[ar, All, #1[[3]] < #2[[3]] &]; ar] triples = {{0, 0, 9.8}, {0, 1, 2.3}, {1, 1, 12.6}}; myRank[triples] => {{0, 0, 2}, {0, 1, 1}, {1, 1, 3}} > Thanks, > Claus > > Here is the mathematica code: > ----------------------------- > > Make up an array with (x, y) being coordinates and z being a value at > that (x, y) location > > Ar = Partition[Flatten[Table[{i, j, k}, > {i, 1, 10} > , {j, 1, 10} > , {k, {RandomReal[]}} > ]], 3]; A more efficient (at least two times faster) version of the above is Ar = Sequence @@@ Table[{i, j, RandomReal[]}, {i, 1, 100}, {j, 1, 100}]; > Time two versions of Sorting the array Ar according to z > > Timing[SortBottomAATriples = Sort[Ar, #1[[3]] < #2[[3]] &]]; > > sll[ll_, elem_] := ll[[Ordering[ll[[All, elem]]]]] > Timing[OrdBotAATrip = sll[Ar, 3]]; > > Create the Ranks of z at the original position from Ar > > those ranks are scaled between [0, 1] > > RanksOfAr = Ordering[SortBottomAATriples]/Length[SortBottomAATriples]; > > Procedure to put it all back together > > x = Ar[[All, 1]]; > y = Ar[[All, 2]]; > FinalAr = Transpose[{x, y, RanksOfAr}] // N; Best regards, -- Jean-Marc