[Scipy-svn] r3107 - in trunk/Lib/sandbox/maskedarray: . tests

scipy-svn at scipy.org scipy-svn at scipy.org
Fri Jun 15 12:15:08 EDT 2007


Author: pierregm
Date: 2007-06-15 11:14:55 -0500 (Fri, 15 Jun 2007)
New Revision: 3107

Modified:
   trunk/Lib/sandbox/maskedarray/core.py
   trunk/Lib/sandbox/maskedarray/extras.py
   trunk/Lib/sandbox/maskedarray/mrecords.py
   trunk/Lib/sandbox/maskedarray/tests/test_core.py
   trunk/Lib/sandbox/maskedarray/tests/test_extras.py
   trunk/Lib/sandbox/maskedarray/tests/test_mrecords.py
Log:
core     : __setitem__ now calls __setmask__ when value is masked
core     : added a test in filled on m.any()
extras   : make_rowcols : make sure the mask is copied to avoid propagation
mrecords : fixed a couple of bugs

Modified: trunk/Lib/sandbox/maskedarray/core.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/core.py	2007-06-15 01:00:10 UTC (rev 3106)
+++ trunk/Lib/sandbox/maskedarray/core.py	2007-06-15 16:14:55 UTC (rev 3107)
@@ -1132,11 +1132,13 @@
 #            raise IndexError, msg
         #....
         if value is masked:
-            if self._mask is nomask:
-                self._mask = make_mask_none(self.shape)
-            else:
-                self._mask = self._mask.copy()
-            self._mask[indx] = True
+            m = self._mask
+            if m is nomask:
+                m = make_mask_none(self.shape)
+#            else:
+#                m = m.copy()
+            m[indx] = True
+            self.__setmask__(m)
             return
         #....
         dval = numeric.asarray(value).astype(self.dtype)
@@ -1261,7 +1263,7 @@
 If `fill_value` is None, uses self.fill_value.
         """
         m = self._mask
-        if m is nomask:
+        if m is nomask or not m.any():
             return self._data
         #
         if fill_value is None:
@@ -2645,4 +2647,13 @@
         assert(a.ravel()._mask, [0,0,0,0])
         assert(a.compressed(), a)
         a[0] = masked
-        assert(a.compressed()._mask, [0,0,0])
\ No newline at end of file
+        assert(a.compressed()._mask, [0,0,0])
+    if 1:
+        x = array(0, mask=0)
+        I = x.ctypes.data
+        J = x.filled().ctypes.data
+        print (I,J)
+        x = array([0,0], mask=0)
+        (I,J) = (x.ctypes.data, x.filled().ctypes.data)
+        print (I,J)
+        
\ No newline at end of file

Modified: trunk/Lib/sandbox/maskedarray/extras.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/extras.py	2007-06-15 01:00:10 UTC (rev 3106)
+++ trunk/Lib/sandbox/maskedarray/extras.py	2007-06-15 16:14:55 UTC (rev 3107)
@@ -411,6 +411,7 @@
     if m is nomask or not m.any():
         return a
     maskedval = m.nonzero()
+    a._mask = a._mask.copy()
     if not axis:
         a[function_base.unique(maskedval[0])] = masked
     if axis in [None, 1, -1]:
@@ -648,7 +649,15 @@
 ################################################################################
 if __name__ == '__main__':
     #
+    import numpy as N
+    from maskedarray.testutils import assert_equal
     if 1:
-        x = arange(10)
-        x[0] = masked
-        print dot(x,x)
\ No newline at end of file
+        n = N.arange(1,7)
+        #
+        m = [1,0,0,0,0,0]
+        a = masked_array(n, mask=m).reshape(2,3)
+        b = masked_array(n, mask=m).reshape(3,2)
+        c = dot(a,b, True)
+        assert_equal(c.mask, [[1,1],[1,0]])
+        c = dot(a,b,False)
+        assert_equal(c, N.dot(a.filled(0), b.filled(0)))
\ No newline at end of file

Modified: trunk/Lib/sandbox/maskedarray/mrecords.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/mrecords.py	2007-06-15 01:00:10 UTC (rev 3106)
+++ trunk/Lib/sandbox/maskedarray/mrecords.py	2007-06-15 16:14:55 UTC (rev 3107)
@@ -115,7 +115,7 @@
         if names is not None:
             descr = _checknames(descr,names)
         _names = descr.names    
-        mdescr = [(t[0],'|b1') for t in descr.descr]
+        mdescr = [(n,'|b1') for n in _names]
         #
         shape = numeric.asarray(data[0]).shape
         if isinstance(shape, int):
@@ -129,7 +129,11 @@
             _fieldmask = data._fieldmask
         elif isinstance(data, recarray):
             _data = data
-            _fieldmask = mask
+            if mask is nomask:
+                _fieldmask = data.astype(mdescr)
+                _fieldmask.flat = tuple([False]*len(mdescr))
+            else:
+                _fieldmask = mask
         else:
             _data = recarray(shape, dtype=descr)
             _fieldmask = recarray(shape, dtype=mdescr)
@@ -179,7 +183,7 @@
             _data = self._data
             _mask = self._fieldmask
             obj = numeric.asarray(_data.__getattribute__(attr)).view(MaskedArray)
-            obj._mask = make_mask(_mask.__getattribute__(attr))
+            obj.__setmask__(_mask.__getattribute__(attr))
             return obj
         raise AttributeError,"No attribute '%s' !" % attr
             
@@ -232,6 +236,10 @@
         obj = ndarray.__getitem__(self, indx).view(type(self))
         obj._fieldmask = _localdict['_fieldmask'][indx]
         return obj
+    #............................................
+    def __setitem__(self, indx, value):
+        """Sets the given record to value."""
+        MaskedArray.__setitem__(self, indx, value)
         
 #    def __getslice__(self, i, j):
 #        """Returns the slice described by [i,j]."""
@@ -243,13 +251,12 @@
     def __setslice__(self, i, j, value):
         """Sets the slice described by [i,j] to `value`."""
         _localdict = self.__dict__
-        
         d = self._data
         m = _localdict['_fieldmask']
         names = self.dtype.names
         if value is masked:
             for n in names:
-                m[i:j][n] = masked
+                m[i:j][n] = True
         elif not self._hardmask:
             fval = filled(value)
             mval = getmaskarray(value)
@@ -484,7 +491,7 @@
         descr = parsed._descr
 
     try:
-        retval = numeric.array(reclist, dtype = descr)
+        retval = numeric.array(reclist, dtype = descr).view(recarray)
     except TypeError:  # list of lists instead of list of tuples
         if (shape is None or shape == 0):
             shape = len(reclist)*2
@@ -645,13 +652,27 @@
 ################################################################################
 if __name__ == '__main__':
     import numpy as N
+    from maskedarray.testutils import assert_equal
     if 1:
         d = N.arange(5)
         m = MA.make_mask([1,0,0,1,1])
         base_d = N.r_[d,d[::-1]].reshape(2,-1).T
         base_m = N.r_[[m, m[::-1]]].T
         base = MA.array(base_d, mask=base_m)    
-        mrecord = fromarrays(base.T,)
-        
+        mrecord = fromarrays(base.T,dtype=[('a',N.float_),('b',N.float_)])
         mrec = MaskedRecords(mrecord)
+        #
+        mrec.a[3:] = 5
+        assert_equal(mrec.a, [0,1,2,5,5])
+        assert_equal(mrec.a._mask, [1,0,0,0,0])
+        #
+        mrec.b[3:] = masked
+        assert_equal(mrec.b, [4,3,2,1,0])
+        assert_equal(mrec.b._mask, [1,1,0,1,1])
+        #
+        mrec[:2] = masked
+        assert_equal(mrec._mask, [1,1,0,0,0])
+        mrec[-1] = masked
+        assert_equal(mrec._mask, [1,1,0,0,1])
+
         
\ No newline at end of file

Modified: trunk/Lib/sandbox/maskedarray/tests/test_core.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/tests/test_core.py	2007-06-15 01:00:10 UTC (rev 3106)
+++ trunk/Lib/sandbox/maskedarray/tests/test_core.py	2007-06-15 16:14:55 UTC (rev 3107)
@@ -240,7 +240,6 @@
         assert(minimum(xm, xm).mask)
         assert(xm.filled().dtype is xm.data.dtype)
         x = array(0, mask=0)
-#        assert(x.filled() is x.data)
         assert_equal(x.filled().ctypes.data, x.ctypes.data)
         assert_equal(str(xm), str(masked_print_option))
     #.........................

Modified: trunk/Lib/sandbox/maskedarray/tests/test_extras.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/tests/test_extras.py	2007-06-15 01:00:10 UTC (rev 3106)
+++ trunk/Lib/sandbox/maskedarray/tests/test_extras.py	2007-06-15 16:14:55 UTC (rev 3107)
@@ -219,18 +219,27 @@
         m = [1,0,0,0,0,0]
         a = masked_array(n, mask=m).reshape(2,3)
         b = masked_array(n, mask=m).reshape(3,2)
-        c = dot(a,b)
+        c = dot(a,b,True)
         assert_equal(c.mask, [[1,1],[1,0]])
-        c = dot(b,a)
+        c = dot(b,a,True)
         assert_equal(c.mask, [[1,1,1],[1,0,0],[1,0,0]])
+        c = dot(a,b,False)
+        assert_equal(c, N.dot(a.filled(0), b.filled(0)))
+        c = dot(b,a,False)
+        assert_equal(c, N.dot(b.filled(0), a.filled(0)))
         #        
         m = [0,0,0,0,0,1]
         a = masked_array(n, mask=m).reshape(2,3)
         b = masked_array(n, mask=m).reshape(3,2)
-        c = dot(a,b)
+        c = dot(a,b,True)
         assert_equal(c.mask,[[0,1],[1,1]])        
-        c = dot(b,a)
+        c = dot(b,a,True)
         assert_equal(c.mask, [[0,0,1],[0,0,1],[1,1,1]])
+        c = dot(a,b,False)
+        assert_equal(c, N.dot(a.filled(0), b.filled(0)))
+        assert_equal(c, dot(a,b))
+        c = dot(b,a,False)
+        assert_equal(c, N.dot(b.filled(0), a.filled(0)))
         #        
         m = [0,0,0,0,0,0]
         a = masked_array(n, mask=m).reshape(2,3)
@@ -242,24 +251,36 @@
         #        
         a = masked_array(n, mask=[1,0,0,0,0,0]).reshape(2,3)
         b = masked_array(n, mask=[0,0,0,0,0,0]).reshape(3,2)
-        c = dot(a,b)
+        c = dot(a,b,True)
         assert_equal(c.mask,[[1,1],[0,0]])
-        c = dot(b,a)
+        c = dot(a,b,False)
+        assert_equal(c, N.dot(a.filled(0),b.filled(0)))
+        c = dot(b,a,True)
         assert_equal(c.mask,[[1,0,0],[1,0,0],[1,0,0]])
+        c = dot(b,a,False)
+        assert_equal(c, N.dot(b.filled(0),a.filled(0)))
         #        
         a = masked_array(n, mask=[0,0,0,0,0,1]).reshape(2,3)
         b = masked_array(n, mask=[0,0,0,0,0,0]).reshape(3,2)
+        c = dot(a,b,True)
+        assert_equal(c.mask,[[0,0],[1,1]])
         c = dot(a,b)
-        assert_equal(c.mask,[[0,0],[1,1]])
-        c = dot(b,a)
+        assert_equal(c, N.dot(a.filled(0),b.filled(0)))        
+        c = dot(b,a,True)
         assert_equal(c.mask,[[0,0,1],[0,0,1],[0,0,1]])
+        c = dot(b,a,False)
+        assert_equal(c, N.dot(b.filled(0), a.filled(0)))
         #        
         a = masked_array(n, mask=[0,0,0,0,0,1]).reshape(2,3)
         b = masked_array(n, mask=[0,0,1,0,0,0]).reshape(3,2)
-        c = dot(a,b)
+        c = dot(a,b,True)
         assert_equal(c.mask,[[1,0],[1,1]])
-        c = dot(b,a)
+        c = dot(a,b,False)
+        assert_equal(c, N.dot(a.filled(0),b.filled(0)))
+        c = dot(b,a,True)
         assert_equal(c.mask,[[0,0,1],[1,1,1],[0,0,1]])
+        c = dot(b,a,False)
+        assert_equal(c, N.dot(b.filled(0),a.filled(0)))
         
     def test_mediff1d(self):    
         "Tests mediff1d"    

Modified: trunk/Lib/sandbox/maskedarray/tests/test_mrecords.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/tests/test_mrecords.py	2007-06-15 01:00:10 UTC (rev 3106)
+++ trunk/Lib/sandbox/maskedarray/tests/test_mrecords.py	2007-06-15 16:14:55 UTC (rev 3107)
@@ -41,54 +41,74 @@
         base_d = N.r_[d,d[::-1]].reshape(2,-1).T
         base_m = N.r_[[m, m[::-1]]].T
         base = MA.array(base_d, mask=base_m)    
-        mrecord = fromarrays(base.T,)
+        mrecord = fromarrays(base.T, dtype=[('a',N.float_),('b',N.float_)])
         self.data = [d, m, mrecord]
         
     def test_get(self):
         "Tests fields retrieval"
         [d, m, mrec] = self.data
         mrec = mrec.copy()
-        assert_equal(mrec.f0, MA.array(d,mask=m))
-        assert_equal(mrec.f1, MA.array(d[::-1],mask=m[::-1]))
+        assert_equal(mrec.a, MA.array(d,mask=m))
+        assert_equal(mrec.b, MA.array(d[::-1],mask=m[::-1]))
         assert((mrec._fieldmask == N.core.records.fromarrays([m, m[::-1]])).all())
         assert_equal(mrec._mask, N.r_[[m,m[::-1]]].all(0))
-        assert_equal(mrec.f0[1], mrec[1].f0)
+        assert_equal(mrec.a[1], mrec[1].a)
         #
         assert(isinstance(mrec[:2], MaskedRecords))
-        assert_equal(mrec[:2]['f0'], d[:2])
+        assert_equal(mrec[:2]['a'], d[:2])
         
     def test_set(self):
         "Tests setting fields/attributes."
         [d, m, mrecord] = self.data
-        mrecord.f0._data[:] = 5
-        assert_equal(mrecord['f0']._data, [5,5,5,5,5])
-        mrecord.f0 = 1
-        assert_equal(mrecord['f0']._data, [1]*5)
-        assert_equal(getmaskarray(mrecord['f0']), [0]*5)
-        mrecord.f1 = MA.masked
-        assert_equal(mrecord.f1.mask, [1]*5)
-        assert_equal(getmaskarray(mrecord['f1']), [1]*5)
+        mrecord.a._data[:] = 5
+        assert_equal(mrecord['a']._data, [5,5,5,5,5])
+        mrecord.a = 1
+        assert_equal(mrecord['a']._data, [1]*5)
+        assert_equal(getmaskarray(mrecord['a']), [0]*5)
+        mrecord.b = MA.masked
+        assert_equal(mrecord.b.mask, [1]*5)
+        assert_equal(getmaskarray(mrecord['b']), [1]*5)
         mrecord._mask = MA.masked
-        assert_equal(getmaskarray(mrecord['f1']), [1]*5)
-        assert_equal(mrecord['f0']._mask, mrecord['f1']._mask)
+        assert_equal(getmaskarray(mrecord['b']), [1]*5)
+        assert_equal(mrecord['a']._mask, mrecord['b']._mask)
         mrecord._mask = MA.nomask
-        assert_equal(getmaskarray(mrecord['f1']), [0]*5)
-        assert_equal(mrecord['f0']._mask, mrecord['f1']._mask)   
+        assert_equal(getmaskarray(mrecord['b']), [0]*5)
+        assert_equal(mrecord['a']._mask, mrecord['b']._mask)   
         #
+    def test_setfields(self):
+        "Tests setting fields."
+        [d, m, mrecord] = self.data
+        mrecord.a[3:] = 5
+        assert_equal(mrecord.a, [0,1,2,5,5])
+        assert_equal(mrecord.a._mask, [1,0,0,0,0])
+        #
+        mrecord.b[3:] = masked
+        assert_equal(mrecord.b, [4,3,2,1,0])
+        assert_equal(mrecord.b._mask, [1,1,0,1,1])
+        
     def test_setslices(self):
         "Tests setting slices."
         [d, m, mrec] = self.data        
         mrec[:2] = 5
-        assert_equal(mrec.f0._data, [5,5,2,3,4])
-        assert_equal(mrec.f1._data, [5,5,2,1,0])
-        assert_equal(mrec.f0._mask, [0,0,0,1,1])
-        assert_equal(mrec.f1._mask, [0,0,0,0,1])
+        assert_equal(mrec.a._data, [5,5,2,3,4])
+        assert_equal(mrec.b._data, [5,5,2,1,0])
+        assert_equal(mrec.a._mask, [0,0,0,1,1])
+        assert_equal(mrec.b._mask, [0,0,0,0,1])
+        #
+        mrec[:2] = masked
+        assert_equal(mrec._mask, [1,1,0,0,1])
+        mrec[-2] = masked
+        assert_equal(mrec._mask, [1,1,0,1,1])
+        #
+    def test_setslices_hardmask(self):
+        "Tests setting slices w/ hardmask."
+        [d, m, mrec] = self.data      
         mrec.harden_mask()
         mrec[-2:] = 5
-        assert_equal(mrec.f0._data, [5,5,2,3,4])
-        assert_equal(mrec.f1._data, [5,5,2,5,0])
-        assert_equal(mrec.f0._mask, [0,0,0,1,1])
-        assert_equal(mrec.f1._mask, [0,0,0,0,1]) 
+        assert_equal(mrec.a._data, [0,1,2,3,4])
+        assert_equal(mrec.b._data, [4,3,2,5,0])
+        assert_equal(mrec.a._mask, [1,0,0,1,1])
+        assert_equal(mrec.b._mask, [1,1,0,0,1]) 
         
     def test_hardmask(self):
         "Test hardmask"
@@ -101,24 +121,26 @@
         mrec.soften_mask()
         assert(not mrec._hardmask)
         mrec._mask = nomask
-        assert(mrec['f1']._mask is nomask)
-        assert_equal(mrec['f0']._mask,mrec['f1']._mask)   
+        assert(mrec['b']._mask is nomask)
+        assert_equal(mrec['a']._mask,mrec['b']._mask)   
 
     def test_fromrecords(self):
         "Test from recarray."
         [d, m, mrec] = self.data
-        nrec = N.core.records.fromarrays(N.r_[[d,d[::-1]]])
-        mrecfr = fromrecords(nrec.tolist())
-        assert_equal(mrecfr.f0, mrec.f0)
-        assert_equal(mrecfr.dtype, mrec.dtype)
+        nrec = N.core.records.fromarrays(N.r_[[d,d[::-1]]],
+                                         dtype=[('a',N.float_),('b',N.float_)])
         #....................
         mrecfr = fromrecords(nrec)
-        assert_equal(mrecfr.f0, mrec.f0)
+        assert_equal(mrecfr.a, mrec.a)
         assert_equal(mrecfr.dtype, mrec.dtype)
         #....................
         tmp = mrec[::-1] #.tolist()
         mrecfr = fromrecords(tmp)
-        assert_equal(mrecfr.f0, mrec.f0[::-1])
+        assert_equal(mrecfr.a, mrec.a[::-1])
+        #....................        
+        mrecfr = fromrecords(nrec.tolist())
+        assert_equal(mrecfr.a, mrec.a)
+        assert_equal(mrecfr.dtype, mrec.dtype)
         
     def test_fromtextfile(self):        
         "Tests reading from a text file."




More information about the Scipy-svn mailing list