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

scipy-svn at scipy.org scipy-svn at scipy.org
Mon Dec 18 23:14:30 EST 2006


Author: pierregm
Date: 2006-12-18 22:14:26 -0600 (Mon, 18 Dec 2006)
New Revision: 2435

Modified:
   trunk/Lib/sandbox/maskedarray/CHANGELOG
   trunk/Lib/sandbox/maskedarray/core.py
   trunk/Lib/sandbox/maskedarray/extras.py
   trunk/Lib/sandbox/maskedarray/tests/test_core.py
   trunk/Lib/sandbox/maskedarray/tests/test_extras.py
Log:
see changelog

Modified: trunk/Lib/sandbox/maskedarray/CHANGELOG
===================================================================
--- trunk/Lib/sandbox/maskedarray/CHANGELOG	2006-12-18 02:47:44 UTC (rev 2434)
+++ trunk/Lib/sandbox/maskedarray/CHANGELOG	2006-12-19 04:14:26 UTC (rev 2435)
@@ -1,3 +1,5 @@
+#2006-12-18 : Extras
+#           : - Added compress2d and mask_rowcols
 #2006-12-13 : - moved 'average' to 'extras'
 #			: Core
 #		    : - Fixed make_mask (forced filling to True)

Modified: trunk/Lib/sandbox/maskedarray/core.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/core.py	2006-12-18 02:47:44 UTC (rev 2434)
+++ trunk/Lib/sandbox/maskedarray/core.py	2006-12-19 04:14:26 UTC (rev 2435)
@@ -947,7 +947,8 @@
                 return dout
             else:
                 return self.__class__(dout, mask=nomask, 
-                                      fill_value=self._fill_value)
+                                      fill_value=self._fill_value,
+                                      dtype = self.dtype,)
         #....
 #        m = self._mask.copy()   
         m = self._mask
@@ -958,7 +959,8 @@
             else:
                 return dout
         else:
-            return self.__class__(dout, mask=mi, fill_value=self._fill_value)
+            return self.__class__(dout, mask=mi, dtype = self.dtype,
+                                  fill_value=self._fill_value)
     #........................
     def __setitem__(self, index, value):
         """x.__setitem__(i, y) <==> x[i]=y
@@ -1001,9 +1003,11 @@
         m = self._mask
         dout = self._data[i:j]
         if m is nomask:
-            return self.__class__(dout, fill_value=self._fill_value)
+            return self.__class__(dout, dtype = self.dtype,
+                                  fill_value=self._fill_value)
         else:
-            return self.__class__(dout, mask=m[i:j], fill_value=self._fill_value)
+            return self.__class__(dout, mask=m[i:j], dtype = self.dtype, 
+                                  fill_value=self._fill_value)
     #........................
     def __setslice__(self, i, j, value):
         """x.__setslice__(i, j, value) <==> x[i:j]=value
@@ -1119,14 +1123,16 @@
 Returns a masked array of the current subclass, with the new `_data` 
 the absolute of the inital `_data`.
         """
-        return self.__class__(self._data.__abs__(), mask=self._mask)
+        return self.__class__(self._data.__abs__(), mask=self._mask,
+                             dtype = self.dtype,)
     #
     def __neg__(self):
         """x.__abs__() <==> neg(x)
 Returns a masked array of the current subclass, with the new `_data` 
 the negative of the inital `_data`."""
         try:
-            return self.__class__(self._data.__neg__(), mask=self._mask)
+            return self.__class__(self._data.__neg__(), mask=self._mask,
+                                  dtype = self.dtype,)
         except MAError:
             return negative(self)
     #
@@ -1233,8 +1239,9 @@
         d = self._data.astype(tc)
 #        print "DEBUG: _astype: d", d
 #        print "DEBUG: _astype: m", self._mask        
-        return self.__class__(d, mask=self._mask)
+        return self.__class__(d, mask=self._mask, dtype=tc)
     #............................................        
+    #TODO: FIX THAT: THAT"S NOT A REAL FLATITER
     def _get_flat(self):
         """Calculates the flat value.
         """
@@ -1425,9 +1432,13 @@
 If you want to modify the shape in place, please use `a.shape = s`"""
         if self._mask is not nomask:
             return self.__class__(self._data.reshape(*s), 
-                                  mask=self._mask.reshape(*s))
+                                  mask=self._mask.reshape(*s),
+                                  dtype = self.dtype,
+                                  fill_value=self.fill_value)
         else:
-            return self.__class__(self._data.reshape(*s))
+            return self.__class__(self._data.reshape(*s),
+                                  dtype = self.dtype,
+                                  fill_value=self.fill_value)
     #
     def repeat(self, repeats, axis=None):
         """Repeat elements of `a` `repeats` times along `axis`.
@@ -1447,7 +1458,8 @@
         if m is not nomask:
             m = fromnumeric.repeat(m, repeats, axis)
         d = fromnumeric.repeat(f, repeats, axis)
-        return self.__class__(d, mask=m, fill_value=self.fill_value)
+        return self.__class__(d, mask=m, dtype = self.dtype,
+                              fill_value=self.fill_value)
     #
     def resize(self, newshape, refcheck=True, order=False):
         """Attempts to modify size and shape of self inplace.  
@@ -1470,38 +1482,17 @@
                   "Use the resize function."
             raise ValueError, msg
         return None
+    #
+    def flatten(self):
+        """Flattens the array in place.
+        """
+        flatsize = self.size
+        self._data.resize((flatsize,))
+        if self.mask is not nomask:
+             self._mask.resize((flatsize,))
+        return self
 
-        
-#    #
-#    def transpose(self,axes=None):
-#        """Returns a view of 'a' with axes transposed."""
-#        (d,m) = (self._data, self._mask)
-#        if m is nomask:
-#            return self.__class__(d.transpose(axes), copy=False)
-#        else:
-#            return self.__class__(d.transpose(axes), 
-#                                  mask=m.transpose(axes), copy=False)
-#    #
-#    def swapaxes(self, axis1, axis2):
-#        (d,m) = (self._data, self._mask)
-#        if m is nomask:
-#            return self.__class__(d.swapaxes(axis1, axis2),
-#                                  copy=False)
-#        else:
-#            return self.__class__(data=d.swapaxes(axis1, axis2),
-#                                  mask=m.swapaxes(axis1, axis2),
-#                                  copy=False)    
     #
-#    def take(self, indices, axis=None, out=None, mode='raise'):
-#        "returns selection of items from a."
-#        (d,m) = (self._data, self._mask)
-#        if m is nomask:
-#            return self.__class__(d.take(indices, axis=axis, out=out, mode=mode))
-#        else:
-#            return self.__class__(d.take(indices, axis=axis, out=out, mode=mode),
-#                             mask=m.take(indices, axis=axis, out=out, mode=mode),
-#                             copy=False,)
-    #
     def put(self, indices, values, mode='raise'):
         """Sets storage-indexed locations to corresponding values.
 a.put(values, indices, mode) sets a.flat[n] = values[n] for each n in indices.
@@ -1534,7 +1525,8 @@
         """
         d = filled(self, True).all(axis)
         m = self._mask.all(axis)
-        return self.__class__(d, mask=m, fill_value=self._fill_value)
+        return self.__class__(d, mask=m, dtype=bool_,
+                              fill_value=self._fill_value,)
     def any(self, axis=None):
         """a.any(axis) returns True if some or all entries along the axis are True.
     Returns False otherwise. If axis is None, uses the flatten array.
@@ -1543,7 +1535,8 @@
         """
         d = filled(self, False).any(axis)
         m = self._mask.all(axis)
-        return self.__class__(d, mask=m, fill_value=self._fill_value) 
+        return self.__class__(d, mask=m, dtype=bool_,
+                              fill_value=self._fill_value) 
     def nonzero(self):
         """a.nonzero() returns a tuple of arrays
 
@@ -1583,13 +1576,15 @@
 #            if axis is None:
 #                return self._data.sum(None, dtype=dtype)
             return self.__class__(self._data.sum(axis, dtype=dtype),
-                                  mask=nomask, fill_value=self._fill_value)
+                                  mask=nomask, dtype = self.dtype,
+                                  fill_value=self.fill_value)
         else:
 #            if axis is None:
 #                return self.filled(0).sum(None, dtype=dtype)
             return self.__class__(self.filled(0).sum(axis, dtype=dtype),
-                                  mask=self._mask.all(axis), 
-                                  fill_value=self._fill_value)
+                                  mask=self._mask.all(axis),
+                                  dtype = self.dtype,
+                                  fill_value=self.fill_value)
             
     def cumsum(self, axis=None, dtype=None):
         """a.cumprod(axis=None, dtype=None)
@@ -1600,12 +1595,16 @@
         if self._mask is nomask:
 #            if axis is None:
 #                return self._data.cumsum(None, dtype=dtype)
-            return self.__class__(self._data.cumsum(axis=axis, dtype=dtype))
+            return self.__class__(self._data.cumsum(axis=axis, dtype=dtype),
+                                  dtype = self.dtype,
+                                  fill_value=self.fill_value)
         else:
 #            if axis is None:
 #                return self.filled(0).cumsum(None, dtype=dtype)
             return self.__class__(self.filled(0).cumsum(axis=axis, dtype=dtype),
-                             mask=self._mask, fill_value=self._fill_value)
+                                  mask=self._mask,
+                                  dtype = self.dtype,
+                                  fill_value=self.fill_value)
         
     def prod(self, axis=None, dtype=None):
         """a.prod(axis=None, dtype=None)
@@ -1617,14 +1616,17 @@
 #            if axis is None:
 #                return self._data.prod(None, dtype=dtype)
             return self.__class__(self._data.prod(axis, dtype=dtype),
-                                  mask=nomask, fill_value=self._fill_value)
+                                  mask=nomask,
+                                  dtype = self.dtype,
+                                  fill_value=self.fill_value)
 #            return self.__class__(self._data.prod(axis=axis, dtype=dtype))
         else:
 #            if axis is None:
 #                return self.filled(1).prod(None, dtype=dtype)
             return self.__class__(self.filled(1).prod(axis=axis, dtype=dtype),
-                                  mask=self._mask.all(axis), 
-                                  fill_value=self._fill_value)
+                                  mask=self._mask.all(axis),
+                                  dtype = self.dtype,
+                                  fill_value=self.fill_value)
     product = prod
             
     def cumprod(self, axis=None, dtype=None):
@@ -1637,12 +1639,16 @@
 #            if axis is None:
 #                return self._data.cumprod(None, dtype=dtype)
             return self.__class__(self._data.cumprod(axis=axis, dtype=dtype),
-                                  mask=nomask, fill_value=self._fill_value)
+                                  mask=nomask,
+                                  dtype = self.dtype,
+                                  fill_value=self.fill_value,)
         else:
 #            if axis is None:
 #                return self.filled(1).cumprod(None, dtype=dtype)
             return self.__class__(self.filled(1).cumprod(axis=axis, dtype=dtype),
-                                  mask=self._mask, fill_value=self._fill_value)        
+                                  mask=self._mask,
+                                  dtype = self.dtype,
+                                  fill_value=self.fill_value)        
             
     def mean(self, axis=None, dtype=None):
         """a.mean(axis=None, dtype=None)
@@ -1661,15 +1667,17 @@
 #            if axis is None:
 #                return self._data.mean(axis=None, dtype=dtype)
             return self.__class__(self._data.mean(axis=axis, dtype=dtype),
-                                  mask=nomask, fill_value=self._fill_value)
+                                  mask=nomask, dtype = self.dtype,
+                                  fill_value=self.fill_value)
         else:
             dsum = fromnumeric.sum(self.filled(0), axis=axis, dtype=dtype)
             cnt = self.count(axis=axis)
             mask = self._mask.all(axis)
             if axis is None and mask:
                 return masked
-            return self.__class__(dsum*1./cnt, mask=mask, 
-                                  fill_value=self._fill_value)
+            return self.__class__(dsum*1./cnt, mask=mask,
+                                  dtype = self.dtype,
+                                  fill_value=self.fill_value,)
     
     def anom(self, axis=None, dtype=None):
         """a.anom(axis=None, dtype=None)
@@ -1692,7 +1700,9 @@
 #            if axis is None:
 #                return self._data.var(axis=None, dtype=dtype)
             return self.__class__(self._data.var(axis=axis, dtype=dtype),
-                                  mask=nomask, fill_value=self._fill_value)
+                                  mask=nomask,
+                                  dtype = self.dtype,
+                                  fill_value=self.fill_value)
         else:
             cnt = self.count(axis=axis)
             danom = self.anom(axis=axis, dtype=dtype)
@@ -1703,7 +1713,8 @@
                 return dvar
             return self.__class__(dvar, 
                                   mask=mask_or(self._mask.all(axis), (cnt==1)),
-                                  fill_value=self._fill_value)
+                                  dtype = self.dtype,
+                                  fill_value=self.fill_value)
             
     def std(self, axis=None, dtype=None):
         """a.std(axis=None, dtype=None)
@@ -1719,8 +1730,9 @@
             else:
                 # Should we use umath.sqrt instead ?
                 return sqrt(dvar)
-        return self.__class__(sqrt(dvar._data), mask=dvar._mask, 
-                              fill_value=self._fill_value)
+        return self.__class__(sqrt(dvar._data), mask=dvar._mask,
+                              dtype = self.dtype,
+                              fill_value=self.fill_value,)
     #............................................
     def argsort(self, axis=None, fill_value=None, kind='quicksort'):
         """Returns an array of indices that sort 'a' along the specified axis.
@@ -1932,7 +1944,8 @@
                 m_other = mask_or(m_other, domain)
         m = mask_or(m_self, m_other)      
         method = getattr(base, self.methodname)       
-        return instance.__class__(method(target, *args), mask=m)
+        return instance.__class__(method(target, *args), mask=m,
+                                  fill_value=instance.fill_value)
 #......................................
 class _compamethods(object):
     """Defines comparison methods (eq, ge, gt...).
@@ -1961,7 +1974,9 @@
         base = instance.filled(self.fill_self)
         target = filled(other, self.fill_other)
         method = getattr(base, self.methodname)      
-        return instance.__class__(method(target, *args), mask=m)  
+        return instance.__class__(method(target, *args), mask=m,
+                                  dtype = instance.dtype,
+                                  fill_value=instance.fill_value)  
 #..........................................................
 MaskedArray.__add__ = _arithmethods('__add__')
 MaskedArray.__radd__ = _arithmethods('__add__')
@@ -2099,18 +2114,19 @@
         return self
     def __call__(self, *args, **params):
         methodname = self._name
-        (d,m, f) = (self.obj._data, self.obj._mask, self.obj._fill_value)
+        (d, m) = (self.obj._data, self.obj._mask)
+        (t, f) = (self.obj.dtype, self.obj._fill_value)
         C = self.obj.__class__
         if m is nomask:
             return C(getattr(d,methodname).__call__(*args, **params),
-                     fill_value=f)
+                     dtype=t, fill_value=f)
         elif self._onmask:
             return C(getattr(d,methodname).__call__(*args, **params),
                      mask=getattr(m,methodname)(*args, **params),
-                     fill_value=f)
+                     dtype=t, fill_value=f)
         else:
             return C(getattr(d,methodname).__call__(*args, **params), mask=m,
-                     fill_value=f) 
+                     dtype=t, fill_value=f) 
 #......................................
 MaskedArray.conj = MaskedArray.conjugate = _arraymethod('conjugate') 
 MaskedArray.diagonal = _arraymethod('diagonal')
@@ -2162,10 +2178,10 @@
             m = umath.logical_and.reduce(m, axis)
 #            return masked_array(t, mask=m, fill_value=get_fill_value(target))
             try:
-                return target.__class__(t, mask=m, 
+                return target.__class__(t, mask=m, dtype=t.dtype,
                                         fill_value=get_fill_value(target))
             except AttributeError:
-                return masked_array(t, mask=m, 
+                return masked_array(t, mask=m, dtype=t.dtype,
                                     fill_value=get_fill_value(target))
     #.........
     def outer(self, a, b):
@@ -2225,10 +2241,10 @@
                                      axis)
             m = umath.logical_and.reduce(m, axis)
             try:
-                return target.__class__(t, mask=m, 
+                return target.__class__(t, mask=m, dtype=t.dtype,
                                         fill_value=get_fill_value(target))
             except AttributeError:
-                return masked_array(t, mask=m, 
+                return masked_array(t, mask=m, dtype=t.dtype,
                                     fill_value=get_fill_value(target))
     #.........
     def outer (self, a, b):
@@ -2461,10 +2477,12 @@
     if isinstance(x, MaskedArray):
         (d,m) = (x._data, x._mask)
         if m is nomask:
-            return masked_array(n_expand_dims(d,axis))
+            return masked_array(n_expand_dims(d,axis),                                
+                                dtype=d.dtype, fill_value=x._fill_value)
         else:
             return masked_array(n_expand_dims(d,axis), 
-                           mask=n_expand_dims(m,axis))
+                                mask=n_expand_dims(m,axis),
+                                dtype=d.dtype, fill_value=x._fill_value)
     else:
         return n_expand_dims(x,axis)
 

Modified: trunk/Lib/sandbox/maskedarray/extras.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/extras.py	2006-12-18 02:47:44 UTC (rev 2434)
+++ trunk/Lib/sandbox/maskedarray/extras.py	2006-12-19 04:14:26 UTC (rev 2435)
@@ -14,8 +14,8 @@
 __all__ = ['apply_along_axis', 'atleast_1d', 'atleast_2d', 'atleast_3d',
                'average',
            'vstack', 'hstack', 'dstack', 'row_stack', 'column_stack',
-           'count_masked', 
-           'masked_all', 'masked_all_like', 'mr_',
+           'compress2d', 'count_masked', 
+           'mask_rowcols','masked_all', 'masked_all_like', 'mr_',
            'notmasked_edges', 'notmasked_contiguous',
            'stdu', 'varu',
            ]
@@ -23,9 +23,8 @@
 from itertools import groupby
 
 import core
-reload(core)
+#reload(core)
 from core import *
-from core import _arraymethod
 
 import numpy
 from numpy import float_
@@ -38,8 +37,9 @@
 from numpy.lib.index_tricks import concatenator
 import numpy.lib.function_base as function_base
 
+#...............................................................................
 def issequence(seq):
-    """Returns True if the argumnet is a sequence (ndarray, list or tuple."""
+    """Returns True if the argumnet is a sequence (ndarray, list or tuple)."""
     if isinstance(seq, ndarray):
         return True
     elif isinstance(seq, tuple):
@@ -290,7 +290,7 @@
         if mask is nomask:
             if weights is None:
                 d = ash[axis] * 1.0
-                n = add.reduce(a._data, axis)
+                n = add.reduce(a._data, axis, dtype=float_)
             else:
                 w = filled(weights, 0.0)
                 wsh = w.shape
@@ -306,14 +306,14 @@
                     r = [None]*len(ash)
                     r[axis] = slice(None, None, 1)
                     w = eval ("w["+ repr(tuple(r)) + "] * ones(ash, float)")
-                    n = add.reduce(a*w, axis)
-                    d = add.reduce(w, axis)
+                    n = add.reduce(a*w, axis, dtype=float_)
+                    d = add.reduce(w, axis, dtype=float_)
                     del w, r
                 else:
                     raise ValueError, 'average: weights wrong shape.'
         else:
             if weights is None:
-                n = add.reduce(a, axis)
+                n = add.reduce(a, axis, dtype=float_)
                 d = umath.add.reduce((-mask), axis=axis, dtype=float_)
             else:
                 w = filled(weights, 0.0)
@@ -321,16 +321,16 @@
                 if wsh == ():
                     wsh = (1,)
                 if wsh == ash:
-                    w = array(w, float, mask=mask, copy=0)
-                    n = add.reduce(a*w, axis)
-                    d = add.reduce(w, axis)
+                    w = array(w, dtype=float_, mask=mask, copy=0)
+                    n = add.reduce(a*w, axis, dtype=float_)
+                    d = add.reduce(w, axis, dtype=float_)
                 elif wsh == (ash[axis],):
                     ni = ash[axis]
                     r = [None]*len(ash)
                     r[axis] = slice(None, None, 1)
                     w = eval ("w["+ repr(tuple(r)) + "] * masked_array(ones(ash, float), mask)")
-                    n = add.reduce(a*w, axis)
-                    d = add.reduce(w, axis)
+                    n = add.reduce(a*w, axis, dtype=float_)
+                    d = add.reduce(w, axis, dtype=float_)
                 else:
                     raise ValueError, 'average: weights wrong shape.'
                 del w
@@ -339,21 +339,74 @@
     result = n/d
     del n
     
-    if isinstance(result, MaskedArray):
+    if isMaskedArray(result):
         if ((axis is None) or (axis==0 and a.ndim == 1)) and \
-           (result._mask is nomask):
+           (result.mask is nomask):
             result = result._data
         if returned:
-            if not isinstance(d, MaskedArray):
+            if not isMaskedArray(d):
                 d = masked_array(d)
             if isinstance(d, ndarray) and (not d.shape == result.shape):
-                d = ones(result.shape, float) * d
+                d = ones(result.shape, dtype=float_) * d
     if returned:
+        print type(result)
         return result, d
     else:
         return result
+    
+#..............................................................................
+def compress2d(x, axis=None):
+    """Suppresses the rows and/or columns of a 2D array that contains masked values.
+    The suppression behavior is selected with the `axis`parameter.
+        - If axis is None, rows and columns are suppressed. 
+        - If axis is 0, only rows are suppressed. 
+        - If axis is 1 or -1, only columns are suppressed.
+    Returns a *pure* ndarray.    
+    """
+    x = asarray(x)
+    if x.ndim <> 2:
+        raise NotImplementedError, "compress2d works for 2D arrays only."
+    m = getmask(x)
+    # Nothing is masked: return x
+    if m is nomask or not m.any():
+        return nxasarray(x)
+    # All is masked: return empty
+    if m.all():
+        return nxarray([])
+    # Builds a list of rows/columns indices
+    (idxr, idxc) = (range(len(x)), range(x.shape[1]))
+    masked = m.nonzero()
+    if not axis:
+        for i in function_base.unique(masked[0]):
+            idxr.remove(i)
+    if axis in [None, 1, -1]:
+        for j in function_base.unique(masked[1]):
+            idxc.remove(j)
+    return nxasarray(x[idxr][:,idxc])    
 
+def mask_rowcols(a, axis=None):
+    """Suppresses the rows and/or columns of a 2D array that contains masked values.
+    The suppression behavior is selected with the `axis`parameter.
+        - If axis is None, rows and columns are suppressed. 
+        - If axis is 0, only rows are suppressed. 
+        - If axis is 1 or -1, only columns are suppressed.
+    Returns a *pure* ndarray.    
+    """
+    a = asarray(a)
+    if a.ndim != 2:
+        raise NotImplementedError, "compress2d works for 2D arrays only."
+    m = getmask(a)
+    # Nothing is masked: return a
+    if m is nomask or not m.any():
+        return a
+    maskedval = m.nonzero()
+    if not axis:
+        a[function_base.unique(maskedval[0])] = masked
+    if axis in [None, 1, -1]:
+        a[:,function_base.unique(maskedval[1])] = masked
+    return a
 
+
 #####--------------------------------------------------------------------------
 #---- --- Concatenation helpers ---
 #####--------------------------------------------------------------------------

Modified: trunk/Lib/sandbox/maskedarray/tests/test_core.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/tests/test_core.py	2006-12-18 02:47:44 UTC (rev 2434)
+++ trunk/Lib/sandbox/maskedarray/tests/test_core.py	2006-12-19 04:14:26 UTC (rev 2435)
@@ -647,79 +647,6 @@
         dma_3 = MaskedArray(dma_1, mask=[1,0,0,0]*6)
         fail_if_equal(dma_3.mask, dma_1.mask)
         
-    def check_testAverage1(self):
-        "Test of average."
-        ott = array([0.,1.,2.,3.], mask=[1,0,0,0])
-        assert_equal(2.0, average(ott,axis=0))
-        assert_equal(2.0, average(ott, weights=[1., 1., 2., 1.]))
-        result, wts = average(ott, weights=[1.,1.,2.,1.], returned=1)
-        assert_equal(2.0, result)
-        assert(wts == 4.0)
-        ott[:] = masked
-        assert(average(ott,axis=0) is masked)
-        ott = array([0.,1.,2.,3.], mask=[1,0,0,0])
-        ott = ott.reshape(2,2)
-        ott[:,1] = masked
-        assert_equal(average(ott,axis=0), [2.0, 0.0])
-        assert(average(ott,axis=1)[0] is masked)
-        assert_equal([2.,0.], average(ott, axis=0))
-        result, wts = average(ott, axis=0, returned=1)
-        assert_equal(wts, [1., 0.])
-
-    def check_testAverage2(self):
-        "More tests of average."
-        w1 = [0,1,1,1,1,0]
-        w2 = [[0,1,1,1,1,0],[1,0,0,0,0,1]]
-        x = arange(6)
-        assert_equal(average(x, axis=0), 2.5)
-        assert_equal(average(x, axis=0, weights=w1), 2.5)
-        y = array([arange(6), 2.0*arange(6)])
-        assert_equal(average(y, None), N.add.reduce(N.arange(6))*3./12.)
-        assert_equal(average(y, axis=0), N.arange(6) * 3./2.)
-        assert_equal(average(y, axis=1), [average(x,axis=0), average(x,axis=0) * 2.0])
-        assert_equal(average(y, None, weights=w2), 20./6.)
-        assert_equal(average(y, axis=0, weights=w2), [0.,1.,2.,3.,4.,10.])
-        assert_equal(average(y, axis=1), [average(x,axis=0), average(x,axis=0) * 2.0])
-        m1 = zeros(6)
-        m2 = [0,0,1,1,0,0]
-        m3 = [[0,0,1,1,0,0],[0,1,1,1,1,0]]
-        m4 = ones(6)
-        m5 = [0, 1, 1, 1, 1, 1]
-        assert_equal(average(masked_array(x, m1),axis=0), 2.5)
-        assert_equal(average(masked_array(x, m2),axis=0), 2.5)
-        assert(average(masked_array(x, m4),axis=0) is masked)
-        assert_equal(average(masked_array(x, m5),axis=0), 0.0)
-        assert_equal(count(average(masked_array(x, m4),axis=0)), 0)
-        z = masked_array(y, m3)
-        assert_equal(average(z, None), 20./6.)
-        assert_equal(average(z, axis=0), [0.,1.,99.,99.,4.0, 7.5])
-        assert_equal(average(z, axis=1), [2.5, 5.0])
-        assert_equal(average(z,axis=0, weights=w2), [0.,1., 99., 99., 4.0, 10.0])
-
-    def check_testAverage3(self):
-        "Yet more tests of average!"
-        a = arange(6)
-        b = arange(6) * 3
-        r1, w1 = average([[a,b],[b,a]], axis=1, returned=1)
-        assert_equal(shape(r1) , shape(w1))
-        assert_equal(r1.shape , w1.shape)
-        r2, w2 = average(ones((2,2,3)), axis=0, weights=[3,1], returned=1)
-        assert_equal(shape(w2) , shape(r2))
-        r2, w2 = average(ones((2,2,3)), returned=1)
-        assert_equal(shape(w2) , shape(r2))
-        r2, w2 = average(ones((2,2,3)), weights=ones((2,2,3)), returned=1)
-        assert_equal(shape(w2), shape(r2))
-        a2d = array([[1,2],[0,4]], float)
-        a2dm = masked_array(a2d, [[0,0],[1,0]])
-        a2da = average(a2d, axis=0)
-        assert_equal(a2da, [0.5, 3.0])
-        a2dma = average(a2dm, axis=0)
-        assert_equal(a2dma, [1.0, 3.0])
-        a2dma = average(a2dm, axis=None)
-        assert_equal(a2dma, 7./3.)
-        a2dma = average(a2dm, axis=1)
-        assert_equal(a2dma, [1.5, 4.0])
-        
     def check_backwards(self):
         "Tests backward compatibility with numpy.core.ma"
         import numpy.core.ma as nma

Modified: trunk/Lib/sandbox/maskedarray/tests/test_extras.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/tests/test_extras.py	2006-12-18 02:47:44 UTC (rev 2434)
+++ trunk/Lib/sandbox/maskedarray/tests/test_extras.py	2006-12-19 04:14:26 UTC (rev 2435)
@@ -26,6 +26,80 @@
 reload(maskedarray.extras)
 from maskedarray.extras import *
 
+class test_average(NumpyTestCase):        
+    "Several tests of average. Why so many ? Good point..."
+    def check_testAverage1(self):
+        "Test of average."
+        ott = array([0.,1.,2.,3.], mask=[1,0,0,0])
+        assert_equal(2.0, average(ott,axis=0))
+        assert_equal(2.0, average(ott, weights=[1., 1., 2., 1.]))
+        result, wts = average(ott, weights=[1.,1.,2.,1.], returned=1)
+        assert_equal(2.0, result)
+        assert(wts == 4.0)
+        ott[:] = masked
+        assert_equal(average(ott,axis=0).mask, [True])
+        ott = array([0.,1.,2.,3.], mask=[1,0,0,0])
+        ott = ott.reshape(2,2)
+        ott[:,1] = masked
+        assert_equal(average(ott,axis=0), [2.0, 0.0])
+        assert_equal(average(ott,axis=1).mask[0], [True])
+        assert_equal([2.,0.], average(ott, axis=0))
+        result, wts = average(ott, axis=0, returned=1)
+        assert_equal(wts, [1., 0.])
+
+    def check_testAverage2(self):
+        "More tests of average."
+        w1 = [0,1,1,1,1,0]
+        w2 = [[0,1,1,1,1,0],[1,0,0,0,0,1]]
+        x = arange(6, dtype=float_)
+        assert_equal(average(x, axis=0), 2.5)
+        assert_equal(average(x, axis=0, weights=w1), 2.5)
+        y = array([arange(6, dtype=float_), 2.0*arange(6)])
+        assert_equal(average(y, None), N.add.reduce(N.arange(6))*3./12.)
+        assert_equal(average(y, axis=0), N.arange(6) * 3./2.)
+        assert_equal(average(y, axis=1), [average(x,axis=0), average(x,axis=0) * 2.0])
+        assert_equal(average(y, None, weights=w2), 20./6.)
+        assert_equal(average(y, axis=0, weights=w2), [0.,1.,2.,3.,4.,10.])
+        assert_equal(average(y, axis=1), [average(x,axis=0), average(x,axis=0) * 2.0])
+        m1 = zeros(6)
+        m2 = [0,0,1,1,0,0]
+        m3 = [[0,0,1,1,0,0],[0,1,1,1,1,0]]
+        m4 = ones(6)
+        m5 = [0, 1, 1, 1, 1, 1]
+        assert_equal(average(masked_array(x, m1),axis=0), 2.5)
+        assert_equal(average(masked_array(x, m2),axis=0), 2.5)
+        assert_equal(average(masked_array(x, m4),axis=0).mask, [True])
+        assert_equal(average(masked_array(x, m5),axis=0), 0.0)
+        assert_equal(count(average(masked_array(x, m4),axis=0)), 0)
+        z = masked_array(y, m3)
+        assert_equal(average(z, None), 20./6.)
+        assert_equal(average(z, axis=0), [0.,1.,99.,99.,4.0, 7.5])
+        assert_equal(average(z, axis=1), [2.5, 5.0])
+        assert_equal(average(z,axis=0, weights=w2), [0.,1., 99., 99., 4.0, 10.0])
+
+    def check_testAverage3(self):
+        "Yet more tests of average!"
+        a = arange(6)
+        b = arange(6) * 3
+        r1, w1 = average([[a,b],[b,a]], axis=1, returned=1)
+        assert_equal(shape(r1) , shape(w1))
+        assert_equal(r1.shape , w1.shape)
+        r2, w2 = average(ones((2,2,3)), axis=0, weights=[3,1], returned=1)
+        assert_equal(shape(w2) , shape(r2))
+        r2, w2 = average(ones((2,2,3)), returned=1)
+        assert_equal(shape(w2) , shape(r2))
+        r2, w2 = average(ones((2,2,3)), weights=ones((2,2,3)), returned=1)
+        assert_equal(shape(w2), shape(r2))
+        a2d = array([[1,2],[0,4]], float)
+        a2dm = masked_array(a2d, [[0,0],[1,0]])
+        a2da = average(a2d, axis=0)
+        assert_equal(a2da, [0.5, 3.0])
+        a2dma = average(a2dm, axis=0)
+        assert_equal(a2dma, [1.0, 3.0])
+        a2dma = average(a2dm, axis=None)
+        assert_equal(a2dma, 7./3.)
+        a2dma = average(a2dm, axis=1)
+        assert_equal(a2dma, [1.5, 4.0])
        
 class test_concatenator(NumpyTestCase):
     "Tests for mr_, the equivalent of r_ for masked arrays."
@@ -98,8 +172,50 @@
         assert_equal(tmp[0][-1], (4, (0,3)))
         assert(tmp[1] is None)
         assert_equal(tmp[2][-1], (6, (0,5)))
+        
+class test_compress2d(NumpyTestCase):
+    "Tests compress2d and mask_row_columns."
+    def check_compress2d(self):
+        "Tests compress2d"
+        x = array(N.arange(9).reshape(3,3), mask=[[1,0,0],[0,0,0],[0,0,0]])
+        assert_equal(compress2d(x), [[4,5],[7,8]] )
+        assert_equal(compress2d(x,0), [[3,4,5],[6,7,8]] )
+        assert_equal(compress2d(x,1), [[1,2],[4,5],[7,8]] )
+        x = array(x._data, mask=[[0,0,0],[0,1,0],[0,0,0]])
+        assert_equal(compress2d(x), [[0,2],[6,8]] )
+        assert_equal(compress2d(x,0), [[0,1,2],[6,7,8]] )
+        assert_equal(compress2d(x,1), [[0,2],[3,5],[6,8]] )
+        x = array(x._data, mask=[[1,0,0],[0,1,0],[0,0,0]])
+        assert_equal(compress2d(x), [[8]] )
+        assert_equal(compress2d(x,0), [[6,7,8]] )
+        assert_equal(compress2d(x,1,), [[2],[5],[8]] )
+        x = array(x._data, mask=[[1,0,0],[0,1,0],[0,0,1]])
+        assert_equal(compress2d(x).size, 0 )
+        assert_equal(compress2d(x,0).size, 0 )
+        assert_equal(compress2d(x,1).size, 0 )
+    #
+    def check_mask_rowcols(self):
+        "Tests mask_rowcols."
+        x = array(N.arange(9).reshape(3,3), mask=[[1,0,0],[0,0,0],[0,0,0]])
+        assert_equal(mask_rowcols(x).mask, [[1,1,1],[1,0,0],[1,0,0]] )
+        assert_equal(mask_rowcols(x,0).mask, [[1,1,1],[0,0,0],[0,0,0]] )
+        assert_equal(mask_rowcols(x,1).mask, [[1,0,0],[1,0,0],[1,0,0]] )
+        x = array(x._data, mask=[[0,0,0],[0,1,0],[0,0,0]])
+        assert_equal(mask_rowcols(x).mask, [[0,1,0],[1,1,1],[0,1,0]] )
+        assert_equal(mask_rowcols(x,0).mask, [[0,0,0],[1,1,1],[0,0,0]] )
+        assert_equal(mask_rowcols(x,1).mask, [[0,1,0],[0,1,0],[0,1,0]] )
+        x = array(x._data, mask=[[1,0,0],[0,1,0],[0,0,0]])
+        assert_equal(mask_rowcols(x).mask, [[1,1,1],[1,1,1],[1,1,0]] )
+        assert_equal(mask_rowcols(x,0).mask, [[1,1,1],[1,1,1],[0,0,0]] )
+        assert_equal(mask_rowcols(x,1,).mask, [[1,1,0],[1,1,0],[1,1,0]] )
+        x = array(x._data, mask=[[1,0,0],[0,1,0],[0,0,1]])
+        assert(mask_rowcols(x).all())
+        assert(mask_rowcols(x,0).all())
+        assert(mask_rowcols(x,1).all())
 
 ###############################################################################
 #------------------------------------------------------------------------------
 if __name__ == "__main__":
-    NumpyTest().run()
\ No newline at end of file
+    NumpyTest().run()
+
+    
\ No newline at end of file




More information about the Scipy-svn mailing list