Re: Lists to mask other lists
- To: mathgroup at smc.vnet.net
 - Subject: [mg19275] Re: Lists to mask other lists
 - From: "Allan Hayes" <hay at haystack.demon.co.uk>
 - Date: Thu, 12 Aug 1999 01:24:27 -0400
 - References: <7o5hi2$rkt@smc.vnet.net> <7ooigc$i0f@smc.vnet.net>
 - Sender: owner-wri-mathgroup at wolfram.com
 
Below I have summarised and timed solutions to this problem (including three
new ones).
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565
PROBLEM
mask:{m1,m2,...} and deal:{d1,d2,...} are lists of lengh 10000; mask is a
list of zeros and ones. We wish to construct a list {r1,r2,...} of length
10000 with ri = If[ mi==0, a, di].
TIMED SOLUTIONS: decreasing speed from top to bottom.
The performance of ReplacePart (next to last) is surprisingly slow, perhaps
others will check it.
mask = Table[Random[Integer], {10000}];
deal = Table[Random[], {10000}];
(temp = deal;
        temp[[Flatten[Position[mask, 0], 1]]] = a; temp); //
    Timing // First (*Allan Hayes*)
(* temp is used to avoid altering the original deal *)
0.22 Second
(controlList = mask /. {1 -> False, 0 -> True};
MapThread[If[#2, a, #1] &, {deal, controlList}]); //
    Timing // First   (*Hartmut Wolf*)
0.5 Second
Transpose[Transpose[{mask, deal }] /. {0, _} -> {0, a}] // Last; //
    Timing // First (*Allan Hayes*)
0.5 Second
rp[0, _] := a
rp[_, x_] := x
MapThread[rp, {mask, deal }]; // Timing // First
  (*Allan Hayes*)
0.55 Second
MapThread[If[#1 == 1, #2, a] &, {mask, deal }]; //
    Timing // First (*David Park, dkeith at hevanet.com,
    DavidBailey, Tobias*)
0.71 Second
If[# == 1, #2, a] & @@@ (Transpose[{mask, deal}]); //
    Timing // First (*Jens - Peer Kuska*)
0.83 Second
If[#[[1]] == 1, #[[2]], a] & /@ (Transpose[{mask, deal}]); // Timing //
First
  (*Allan Hayes*)
1.1 Second
ReplacePart[deal, a, Position[mask, 0]]; // Timing // First (*Ted Ersek*)
69.43 Second
(F[x_] := a;
pos = Position[mask, 0];
MapAt[F, deal, pos]); // Timing // First (*Peltio*)
87.11 Second