MathGroup Archive 2008

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

Search the Archive

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



  • Prev by Date: Re: A Problem with Simplify
  • Next by Date: Re: Ranks for an array of triplets
  • Previous by thread: Re: Ranks for an array of triplets
  • Next by thread: Re: Ranks for an array of triplets