       Re: Ranks for an array of triplets

• To: mathgroup at smc.vnet.net
• Subject: [mg87519] Re: [mg87498] Ranks for an array of triplets
• From: Darren Glosemeyer <darreng at wolfram.com>
• Date: Sat, 12 Apr 2008 06:57:36 -0400 (EDT)
• References: <200804110957.FAA08413@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?
>
> 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];
>
>
>
>
> Time two versions of Sorting the array Ar according to z
>
> Timing[SortBottomAATriples = Sort[Ar, #1[] < #2[] &]];
>
> 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;
>

One possibility is to make a copy of Ar

FinalAr2 = Ar;

and then replace the last column of that copy with the scaled ranks.

FinalAr2[[All, -1]] =
Ordering[Ordering[Ar, All, #[[-1]] < #2[[-1]] &]]/Length[Ar];

Then FinalAr2 will be the desired matrix. That's technically two steps,
but the first one is pretty easy.

Darren Glosemeyer
Wolfram Research

```

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