[Numpy-discussion] Trouble With MaskedArray and Shared Masks
Alexander Michael
lxander.m@gmail....
Tue Feb 26 08:25:50 CST 2008
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
More information about the Numpy-discussion
mailing list