I'm having trouble with MaskedArray's _sharedmask flag. I would like to
create a sub-view of a MaskedArray, fill it, and have the modifications
reflected in the original array. This works with regular ndarrays, but
only works with MaskedArrays if _sharedmask is set to False. Here's an example:

>>> a = numpy.ma.MaskedArray(
...     data=numpy.zeros((4,5), dtype=float),
...     mask=numpy.ones((4,5), dtype=numpy.ma.MaskType),
...     fill_value=0.0
... )

>>> sub_a = a[:2,:3]
>>> sub_a[0,0] = 1.0

>>> print sub_a
[[1.0 -- --]
 [-- -- --]]

>>> print a
[[-- -- -- -- --]
 [-- -- -- -- --]
 [-- -- -- -- --]
 [-- -- -- -- --]]

>>> print a.data
[[ 1.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]]

The data array receives the new value, but the mask array does not.

>>> a._sharedmask = False
>>> sub_a = a[:2,:3]
>>> sub_a[0,0] = 1.0

>>> print sub_a
[[1.0 -- --]
 [-- -- --]]

>>> print a
[[1.0 -- -- -- --]
 [-- -- -- -- --]
 [-- -- -- -- --]
 [-- -- -- -- --]]

This sort of (for me) unexpected behavior extends to other ways I've
been using numpy arrays as well: a[:] = 1.0 (set to constant); a[:] =
b (copy into); a[:5] = a[-5:] (rotating copy), etc. I wasn't seeing
this behavior before because I was working on an array that had
already been sliced and therefore "unshared", which caused a good deal
of confusion for me when I started working on an array that wasn't the
product of slicing.

All of this leads me to some questions. What is the rational for
initializing a new MaskedArray with _sharedmask=True when its mask
isn't (actively) being shared yet? Is there a better way to say:
"a=MaskedArray(...); a._sharedmask=False" that does not require
touching a "private" attribute? Or am I going about this all wrong?
What's the correct MaskedArray idioms for these actions that doesn't
cause a new mask to be created?

Thanks!
Alex
_______________________________________________
Numpy-discussion mailing list
Numpy-discussion@scipy.org
http://projects.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to