Fix masked arrays to properly edit views
The sample case of the issue ( https://github.com/numpy/numpy/issues/5558 ) is shown below. A proposal to address this behavior can be found here ( https://github.com/numpy/numpy/pull/5580 ). Please give me your feedback. I tried to change the mask of `a` through a subindexed view, but was unable. Using this setup I can reproduce this in the 1.9.1 version of NumPy. import numpy as np a = np.arange(6).reshape(2,3) a = np.ma.masked_array(a, mask=np.ma.getmaskarray(a), shrink=False) b = a[1:2,1:2] c = np.zeros(b.shape, b.dtype) c = np.ma.masked_array(c, mask=np.ma.getmaskarray(c), shrink=False) c[:] = np.ma.masked This yields what one would expect for `a`, `b`, and `c` (seen below). masked_array(data = [[0 1 2] [3 4 5]], mask = [[False False False] [False False False]], fill_value = 999999) masked_array(data = [[4]], mask = [[False]], fill_value = 999999) masked_array(data = [[--]], mask = [[ True]], fill_value = 999999) Now, it would seem reasonable that to copy data into `b` from `c` one can use `__setitem__` (seen below). b[:] = c This results in new data and mask for `b`. masked_array(data = [[--]], mask = [[ True]], fill_value = 999999) This should, in turn, change `a`. However, the mask of `a` remains unchanged (seen below). masked_array(data = [[0 1 2] [3 0 5]], mask = [[False False False] [False False False]], fill_value = 999999) Best, John
On 2015/03/14 1:02 PM, John Kirkham wrote:
The sample case of the issue ( https://github.com/numpy/numpy/issues/5558 ) is shown below. A proposal to address this behavior can be found here ( https://github.com/numpy/numpy/pull/5580 ). Please give me your feedback.
I tried to change the mask of `a` through a subindexed view, but was unable. Using this setup I can reproduce this in the 1.9.1 version of NumPy.
import numpy as np
a = np.arange(6).reshape(2,3) a = np.ma.masked_array(a, mask=np.ma.getmaskarray(a), shrink=False)
b = a[1:2,1:2]
c = np.zeros(b.shape, b.dtype) c = np.ma.masked_array(c, mask=np.ma.getmaskarray(c), shrink=False) c[:] = np.ma.masked
This yields what one would expect for `a`, `b`, and `c` (seen below).
masked_array(data = [[0 1 2] [3 4 5]], mask = [[False False False] [False False False]], fill_value = 999999)
masked_array(data = [[4]], mask = [[False]], fill_value = 999999)
masked_array(data = [[--]], mask = [[ True]], fill_value = 999999)
Now, it would seem reasonable that to copy data into `b` from `c` one can use `__setitem__` (seen below).
b[:] = c
This results in new data and mask for `b`.
masked_array(data = [[--]], mask = [[ True]], fill_value = 999999)
This should, in turn, change `a`. However, the mask of `a` remains unchanged (seen below).
masked_array(data = [[0 1 2] [3 0 5]], mask = [[False False False] [False False False]], fill_value = 999999)
I agree that this behavior is wrong. A related oddity is this: In [24]: a = np.arange(6).reshape(2,3) In [25]: a = np.ma.array(a, mask=np.ma.getmaskarray(a), shrink=False) In [27]: a.sharedmask True In [28]: a.unshare_mask() In [30]: b = a[1:2, 1:2] In [31]: b[:] = np.ma.masked In [32]: b.sharedmask False In [33]: a masked_array(data = [[0 1 2] [3 -- 5]], mask = [[False False False] [False True False]], fill_value = 999999) It looks like the sharedmask property simply is not being set and interpreted correctly--a freshly initialized array has sharedmask True; and after setting it to False, changing the mask of a new view *does* change the mask in the original. Eric
Best, John
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
participants (2)
-
Eric Firing
-
John Kirkham