[Numpy-svn] r6349 - in trunk/numpy/ma: . tests

numpy-svn at scipy.org numpy-svn at scipy.org
Sat Feb 7 04:19:14 EST 2009


Author: pierregm
Date: 2009-02-07 03:19:12 -0600 (Sat, 07 Feb 2009)
New Revision: 6349

Modified:
   trunk/numpy/ma/core.py
   trunk/numpy/ma/tests/test_core.py
Log:
MaskedArray.resize : systematically raise a TypeError exception, as a masked array never owns its data
MaskedIterator : fixed to allow .flat on masked matrices

Modified: trunk/numpy/ma/core.py
===================================================================
--- trunk/numpy/ma/core.py	2009-02-06 14:38:57 UTC (rev 6348)
+++ trunk/numpy/ma/core.py	2009-02-07 09:19:12 UTC (rev 6349)
@@ -1478,9 +1478,8 @@
     "Define an interator."
     def __init__(self, ma):
         self.ma = ma
-        self.ma1d = ma.ravel()
-        self.ma_iter = np.asarray(ma).flat
-
+        self.dataiter = ma._data.flat
+        #
         if ma._mask is nomask:
             self.maskiter = None
         else:
@@ -1490,15 +1489,23 @@
         return self
 
     def __getitem__(self, indx):
-        return self.ma1d.__getitem__(indx)
+        result = self.dataiter.__getitem__(indx).view(type(self.ma))
+        if self.maskiter is not None:
+            _mask = self.maskiter.__getitem__(indx)
+            _mask.shape = result.shape
+            result._mask = _mask
+        return result
 
     ### This won't work is ravel makes a copy
     def __setitem__(self, index, value):
-        self.ma1d[index] = value
+        self.dataiter[index] = getdata(value)
+        if self.maskiter is not None:
+            self.maskiter[index] = getmaskarray(value)
+#        self.ma1d[index] = value
 
     def next(self):
         "Returns the next element of the iterator."
-        d = self.ma_iter.next()
+        d = self.dataiter.next()
         if self.maskiter is not None and self.maskiter.next():
             d = masked
         return d
@@ -2707,25 +2714,24 @@
         return result
     #
     def resize(self, newshape, refcheck=True, order=False):
-        """Attempt to modify the size and the shape of the array in place.
+        """
+    Change shape and size of array in-place.
 
-        The array must own its own memory and not be referenced by
-        other arrays.
-
-        Returns
-        -------
-        None.
-
         """
-        try:
-            self._data.resize(newshape, refcheck, order)
-            if self.mask is not nomask:
-                self._mask.resize(newshape, refcheck, order)
-        except ValueError:
-            raise ValueError("Cannot resize an array that has been referenced "
-                             "or is referencing another array in this way.\n"
-                             "Use the resize function.")
-        return None
+        # Note : the 'order' keyword looks broken, let's just drop it
+#        try:
+#            ndarray.resize(self, newshape, refcheck=refcheck)
+#            if self.mask is not nomask:
+#                self._mask.resize(newshape, refcheck=refcheck)
+#        except ValueError:
+#            raise ValueError("Cannot resize an array that has been referenced "
+#                             "or is referencing another array in this way.\n"
+#                             "Use the numpy.ma.resize function.")
+#        return None
+        errmsg = "A masked array does not own its data "\
+                 "and therefore cannot be resized.\n" \
+                 "Use the numpy.ma.resize function instead."
+        raise ValueError(errmsg)
     #
     def put(self, indices, values, mode='raise'):
         """

Modified: trunk/numpy/ma/tests/test_core.py
===================================================================
--- trunk/numpy/ma/tests/test_core.py	2009-02-06 14:38:57 UTC (rev 6348)
+++ trunk/numpy/ma/tests/test_core.py	2009-02-07 09:19:12 UTC (rev 6349)
@@ -1122,6 +1122,17 @@
         a[1] = 1
         assert_equal(a._mask, zeros(10))
 
+    def test_flat(self):
+        "Test flat on masked_matrices"
+        test = ma.array(np.matrix([[1, 2, 3]]), mask=[0, 0, 1])
+        test.flat = ma.array([3, 2, 1], mask=[1, 0, 0])
+        control = ma.array(np.matrix([[3, 2, 1]]), mask=[1, 0, 0])
+        assert_equal(test, control)
+        #
+        test = ma.array(np.matrix([[1, 2, 3]]), mask=[0, 0, 1])
+        testflat = test.flat
+        testflat[:] = testflat[[2, 1, 0]]
+        assert_equal(test, control)
 
 #------------------------------------------------------------------------------
 




More information about the Numpy-svn mailing list