[Numpy-svn] r4622 - in branches/maskedarray/numpy/ma: . tests

numpy-svn at scipy.org numpy-svn at scipy.org
Thu Dec 20 02:36:42 EST 2007


Author: stefan
Date: 2007-12-20 01:36:21 -0600 (Thu, 20 Dec 2007)
New Revision: 4622

Modified:
   branches/maskedarray/numpy/ma/core.py
   branches/maskedarray/numpy/ma/tests/test_core.py
Log:
Apply Pierre's patch.


Modified: branches/maskedarray/numpy/ma/core.py
===================================================================
--- branches/maskedarray/numpy/ma/core.py	2007-12-18 10:43:57 UTC (rev 4621)
+++ branches/maskedarray/numpy/ma/core.py	2007-12-20 07:36:21 UTC (rev 4622)
@@ -78,7 +78,7 @@
 
 
 MaskType = bool_
-nomask = MaskType(0)
+nomask = narray(False)
 
 divide_tolerance = 1.e-35
 numpy.seterr(all='ignore')
@@ -1171,7 +1171,7 @@
         return
     #........................
     def __array_finalize__(self,obj):
-        """Finalizes the masked array.
+        """Finalize the masked array.
         """
         # Get main attributes .........
         self._mask = getattr(obj, '_mask', nomask)
@@ -1183,6 +1183,7 @@
         # Finalize the mask ...........
         if self._mask is not nomask:
             self._mask.shape = self.shape
+#        self._data = self.view(self._baseclass)
         return
     #..................................
     def __array_wrap__(self, obj, context=None):
@@ -2798,13 +2799,38 @@
     If values is not the same size of a and mask then it will repeat
     as necessary.  This gives different behavior than
     a[mask] = values.
+    
+    Note: Using a masked array as values will NOT transform a ndarray in
+          a maskedarray.
 
     """
     # We can't use 'frommethod', the order of arguments is different
-    try:
-        return a.putmask(values, mask)
-    except AttributeError:
-        return numpy.putmask(narray(a, copy=False), mask, values)
+#    try:
+#        return a.putmask(values, mask)
+#    except AttributeError:
+#        return numpy.putmask(narray(a, copy=False), mask, values)
+    if not isinstance(a, MaskedArray):
+        a = a.view(MaskedArray)
+    (valdata, valmask) = (getdata(values), getmask(values))
+    if getmask(a) is nomask:
+        if valmask is not nomask:
+            a._sharedmask = True
+            a.mask = numpy.zeros(a.shape, dtype=bool_)
+            numpy.putmask(a._mask, mask, valmask)
+#            m = numpy.zeros(a.shape, dtype=bool_)
+#            numpy.putmask(m, mask, valmask)
+#            a = masked_array(a, copy=False, subok=True, mask=m)
+    elif a._hardmask:
+        if valmask is not nomask:
+            m = a._mask.copy()
+            numpy.putmask(m, mask, valmask)
+            a.mask |= m
+    else:
+        if valmask is nomask:
+            valmask = getmaskarray(values)
+        numpy.putmask(a._mask, mask, valmask)
+    numpy.putmask(a._data, mask, valdata)
+    return
 
 def transpose(a,axes=None):
     """Return a view of the array with dimensions permuted according to axes,
@@ -3142,63 +3168,41 @@
     return cPickle.loads(strg)
 
 
+
+
 ###############################################################################
-
+#
 if __name__ == '__main__':
-    from numpy.ma.testutils import assert_equal, assert_almost_equal
+    from maskedarray.testutils import assert_equal, assert_almost_equal
 
-    # Small arrays ..................................
-    xs = numpy.random.uniform(-1,1,6).reshape(2,3)
-    ys = numpy.random.uniform(-1,1,6).reshape(2,3)
-    zs = xs + 1j * ys
-    m1 = [[True, False, False], [False, False, True]]
-    m2 = [[True, False, True], [False, False, True]]
-    nmxs = numpy.ma.array(xs, mask=m1)
-    nmys = numpy.ma.array(ys, mask=m2)
-    nmzs = numpy.ma.array(zs, mask=m1)
-    mmxs = array(xs, mask=m1)
-    mmys = array(ys, mask=m2)
-    mmzs = array(zs, mask=m1)
-    # Big arrays ....................................
-    xl = numpy.random.uniform(-1,1,100*100).reshape(100,100)
-    yl = numpy.random.uniform(-1,1,100*100).reshape(100,100)
-    zl = xl + 1j * yl
-    maskx = xl > 0.8
-    masky = yl < -0.8
-    nmxl = numpy.ma.array(xl, mask=maskx)
-    nmyl = numpy.ma.array(yl, mask=masky)
-    nmzl = numpy.ma.array(zl, mask=maskx)
-    mmxl = array(xl, mask=maskx, shrink=True)
-    mmyl = array(yl, mask=masky, shrink=True)
-    mmzl = array(zl, mask=maskx, shrink=True)
-    #
-    z = empty(3,)
-    mmys.all(0, out=z)
-
     if 1:
-        x = numpy.array([[ 0.13,  0.26,  0.90],
-                     [ 0.28,  0.33,  0.63],
-                     [ 0.31,  0.87,  0.70]])
-        m = numpy.array([[ True, False, False],
-                     [False, False, False],
-                     [True,  True, False]], dtype=numpy.bool_)
-        mx = masked_array(x, mask=m)
-        xbig = numpy.array([[False, False,  True],
-                        [False, False,  True],
-                        [False,  True,  True]], dtype=numpy.bool_)
-        mxbig = (mx > 0.5)
-        mxsmall = (mx < 0.5)
-        #
-        assert (mxbig.all()==False)
-        assert (mxbig.any()==True)
-        assert_equal(mxbig.all(0),[False, False, True])
-        assert_equal(mxbig.all(1), [False, False, True])
-        assert_equal(mxbig.any(0),[False, False, True])
-        assert_equal(mxbig.any(1), [True, True, True])
+        x = array([1,2,3,4,5,6])
+        mx = array(x, mask=[0,0,0,1,1,1])
+        mask = [0,0,1,0,0,1]
+    if 1:
+        # w/o mask, w/o masked values
+        xx = x.copy()
+        putmask(xx, mask, 99)
+        assert_equal(xx, [1,2,99,4,5,99])
+        # w/ mask, w/o masked values
+        mxx = mx.copy()
+        putmask(mxx, mask, 99)
+        assert_equal(mxx._data, [1,2,99,4,5,99])
+        assert_equal(mxx._mask, [0,0,0,1,1,0])
+        # w/o mask, w/ masked values
+        values = array([10,20,30,40,50,60],mask=[1,1,1,0,0,0])
+        xx = x.copy()
+        putmask(xx, mask, values)
+        assert_equal(xx._data, [1,2,30,4,5,60])
+        assert_equal(xx._mask, [0,0,1,0,0,0])
+        # w/ mask, w/ masked values
+        mxx = mx.copy()
+        putmask(mxx, mask, values)
+        assert_equal(mxx._data, [1,2,30,4,5,60])
+        assert_equal(mxx._mask, [0,0,1,1,1,0])
+        # w/ mask, w/ masked values + hardmask
+        mxx = mx.copy()
+        mxx.harden_mask()
+        putmask(mxx, mask, values)
+        assert_equal(mxx, [1,2,30,4,5,60])
 
-    if 1:
-        xx = array([1+10j,20+2j], mask=[1,0])
-        assert_equal(xx.imag,[10,2])
-        assert_equal(xx.imag.filled(), [1e+20,2])
-        assert_equal(xx.real,[1,20])
-        assert_equal(xx.real.filled(), [1e+20,20])

Modified: branches/maskedarray/numpy/ma/tests/test_core.py
===================================================================
--- branches/maskedarray/numpy/ma/tests/test_core.py	2007-12-18 10:43:57 UTC (rev 4621)
+++ branches/maskedarray/numpy/ma/tests/test_core.py	2007-12-20 07:36:21 UTC (rev 4622)
@@ -1303,6 +1303,38 @@
         data = masked_array([[1]], mask=True)
         assert(data.squeeze() is masked)
 
+    def check_putmask(self):
+        x = numpy.arange(6)+1
+        mx = array(x, mask=[0,0,0,1,1,1])
+        mask = [0,0,1,0,0,1]
+
+        # w/o mask, w/o masked values
+        xx = x.copy()
+        putmask(xx, mask, 99)
+        assert_equal(xx, [1,2,99,4,5,99])
+        # w/ mask, w/o masked values
+        mxx = mx.copy()
+        putmask(mxx, mask, 99)
+        assert_equal(mxx._data, [1,2,99,4,5,99])
+        assert_equal(mxx._mask, [0,0,0,1,1,0])
+        # w/o mask, w/ masked values
+        values = array([10,20,30,40,50,60],mask=[1,1,1,0,0,0])
+        xx = x.copy()
+        putmask(xx, mask, values)
+        assert_equal(xx._data, [1,2,30,4,5,60])
+        assert_equal(xx._mask, [0,0,1,0,0,0])
+        # w/ mask, w/ masked values
+        mxx = mx.copy()
+        putmask(mxx, mask, values)
+        assert_equal(mxx._data, [1,2,30,4,5,60])
+        assert_equal(mxx._mask, [0,0,1,1,1,0])
+        # w/ mask, w/ masked values + hardmask
+        mxx = mx.copy()
+        mxx.harden_mask()
+        putmask(mxx, mask, values)
+        assert_equal(mxx, [1,2,30,4,5,60])
+
+
 #..............................................................................
 
 ###############################################################################




More information about the Numpy-svn mailing list