[Numpy-discussion] Trouble With MaskedArray and Shared Masks

Pierre GM pgmdevlist@gmail....
Wed Feb 27 09:54:35 CST 2008


Alexander,

> create the MaskedArray to:
> >>> a = numpy.ma.MaskedArray(
>
> ...     data=numpy.zeros((4,5), dtype=float),
> ...     mask=True,
> ...     fill_value=0.0
> ... )

By far the easiest indeed.


> >  So: should we introduce this extra parameter ?
>
> The propagation semantics and mechanics are definitely tricky,
> especially considering that it seems that the "right behavior" is
> context dependent. Are the mask propagation rules spelled out anywhere
> (aside from the code! :-))? 

Mmh, no: we tried to avoid mask propagation as much as possible, as it can 
have some fairly disastrous side-effects. In other terms, no propagation by 
default when a mask is shared, propagation when the mask is not shared.


> I could see some potential value to an 
> additional argument, but the constructor is already quite complicated
> so I'm reluctant to say "Yes" outright, especially with my current
> level of understanding. 

Yes, there are already a lot of parameters, some more useful than others:
hard_mask : if True, prevent a masked value to be accidentally unmasked.
shrink: if True, force a mask full of False to nomask
keep_mask : when creating a new masked_array for an existing one, specifies 
whether the old mask should be taken into account or not. By default, 
keep_mask is True

For example:
>>>import numpy.mas as ma
>>>x=ma.array([1,2,3,4,5],mask=[1,0,0,1,0])
>>>y=ma.array(x)
>>>y
masked_array(data = [-- 2 3 -- 5],
      mask = [ True False False  True False],
      fill_value=999999)

We just inherited the mask from x: y._mask and x._mask are the same object, 
and y._sharedmask is True. Now, let's change keep_mask to False

>>>y=ma.array(x,keep_mask=False)
>>>y
masked_array(data = [1 2 3 4 5],
      mask = False,
      fill_value=999999)
We keep the data from x, but we force the mask to the default (viz, nomask)
Now for some more fun: remember that we keep the mask by defulat

>>>y=ma.array(x,mask=[0,0,0,0,1])
>>>y
masked_array(data = [-- 2 3 -- --],
      mask = [ True False False  True  True],
      fill_value=999999)

We kept the mask of x ([1,0,0,1,0]) and combined it with our new mask 
([0,0,0,0,1]), so y._mask=[1,0,0,1,1]
If you really want [0,0,0,0,1] as a mask, just drop the initial mask:
>>>y=ma.array(x,mask=[0,0,0,0,1], keep_mask=False)
>>>y
masked_array(data = [1 2 3 4 --],
      mask = [False False False False  True],
      fill_value=999999)






> At the very least, perhaps the doc-string 
> should be amended to include the note that if a mask is provided, it
> is assumed to be shared and a copy of it will be made when/if it is
> modified.
Sounds like a good idea. is there a wiki page for MaskedArrays somewhere ? If 
not, Alexander, feel free to start one from your experience, I'll update if 
needed.


More information about the Numpy-discussion mailing list