Re: Masked array operations
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg1667] Re: [mg1613] Masked array operations
- From: Allan Hayes <hay at haystack.cybernetics.net>
- Date: Tue, 11 Jul 1995 04:37:15 -0400
"Mark D. Reeve" <msreeve at netcom.com>
in [mg1613] Masked array operations
wrote
>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:
How about
ReduceX2[data_, mask_, levelspec_:1]:=
Delete[data, Position[mask,0, levelspec]]
?
Example
data={1,2,3,4,5,6};
mask={1,0,0,1,0,1};
ReduceX2[data, mask]
{1, 4, 6}
You can get more control by using more controls for Position
Allan Hayes
hay at haystack.demon.co.uk