Re: Masked array operations
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg1666] Re: [mg1613] Masked array operations
- From: Lou Talman <me at talmanl.mscd.edu>
- Date: Tue, 11 Jul 1995 04:27:14 -0400
Try:
In[1]:=
Chi[0, x_] := {};
Chi[1, x_] := {x};
mask = {1, 0, 0, 1, 0, 1};
data = {1, 2, 3, 4, 5, 6};
In[5]:=
Inner[Chi, mask, data, Join]
Out[5]=
{1, 4, 6}
Begin forwarded message:
>Date: Thu, 6 Jul 1995 22:12:55 -0400
>From: msreeve at netcom.com (Mark D. Reeve)
>Subject: [mg1613] Masked array operations
Suppose I have a data array, say 1-D, and a boolean (1/0 or True/False)
array
of the same length. How I can I reduce the data array by the boolean
array?
e.g. data={1,2,3,4,5,6};
mask={1,0,0,1,0,1};
I want something like the APL operator "/" such that mask/data yields
{1,4,6}. Ideally this operator should work over any arbitrary dimension
of the array.
You can do it with Select by first pairing the data and the mask, but
this seems slow. The best I have come up with is:
ReduceX[arr_,mask_,dim_:1]:=
Module[{p},
p=Flatten[Position[mask,1],1];
Return[Map[#[[p]]&,arr,{dim-1}]];
];
where dim is the dimension (first is 1) over which to perform the
reduction. This seems rather unwieldy for such an outwardly simple
operation. Can anyone improve it?
Mark Reeve
msreeve at netcom.com OR mreeve at xti.com