[Scipy-svn] r2861 - in trunk/Lib/sandbox/maskedarray: . alternative_versions tests
scipy-svn at scipy.org
scipy-svn at scipy.org
Wed Mar 21 17:28:09 EDT 2007
Author: pierregm
Date: 2007-03-21 16:28:05 -0500 (Wed, 21 Mar 2007)
New Revision: 2861
Added:
trunk/Lib/sandbox/maskedarray/alternative_versions/test_mrecarray.py
Modified:
trunk/Lib/sandbox/maskedarray/core.py
trunk/Lib/sandbox/maskedarray/mrecords.py
trunk/Lib/sandbox/maskedarray/tests/test_subclassing.py
trunk/Lib/sandbox/maskedarray/testutils.py
Log:
fixed a pb w/ mask propagation
force the update of __dict__ w/ the __dict__ of data
moved test_mrecarray to 'alternative_versions'
Added: trunk/Lib/sandbox/maskedarray/alternative_versions/test_mrecarray.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/alternative_versions/test_mrecarray.py 2007-03-20 19:31:18 UTC (rev 2860)
+++ trunk/Lib/sandbox/maskedarray/alternative_versions/test_mrecarray.py 2007-03-21 21:28:05 UTC (rev 2861)
@@ -0,0 +1,128 @@
+# pylint: disable-msg=W0611, W0612, W0511,R0201
+"""Tests suite for mrecarray.
+
+:author: Pierre Gerard-Marchant
+:contact: pierregm_at_uga_dot_edu
+:version: $Id: test_mrecarray.py 68 2007-01-10 17:46:04Z backtopop $
+"""
+__author__ = "Pierre GF Gerard-Marchant ($Author: backtopop $)"
+__version__ = '1.0'
+__revision__ = "$Revision: 68 $"
+__date__ = '$Date: 2007-01-10 12:46:04 -0500 (Wed, 10 Jan 2007) $'
+
+import types
+
+import numpy as N
+import numpy.core.fromnumeric as fromnumeric
+from numpy.testing import NumpyTest, NumpyTestCase
+from numpy.testing.utils import build_err_msg
+
+import maskedarray.testutils
+from maskedarray.testutils import *
+
+import maskedarray.core as MA
+import maskedarray.mrecords
+from maskedarray.mrecords import mrecarray, fromarrays, fromtextfile, fromrecords
+
+
+#..............................................................................
+class test_mrecarray(NumpyTestCase):
+ "Base test class for MaskedArrays."
+ def __init__(self, *args, **kwds):
+ NumpyTestCase.__init__(self, *args, **kwds)
+ self.setup()
+
+ def setup(self):
+ "Generic setup"
+ 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)
+ mrec = fromarrays(base.T,)
+ self.data = [d, m, mrec]
+
+ def test_get(self):
+ "Tests fields retrieval"
+ [d, m, mrec] = self.data
+ assert_equal(mrec.f0, MA.array(d,mask=m))
+ assert_equal(mrec.f1, 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, mrec['f0'])
+
+ def test_set(self):
+ "Tests setting fields/attributes."
+ [d, m, mrec] = self.data
+ mrec.f0_data = 5
+ assert_equal(mrec['f0_data'], [5,5,5,5,5])
+ mrec.f0 = 1
+ assert_equal(mrec['f0_data'], [1]*5)
+ assert_equal(mrec['f0_mask'], [0]*5)
+ mrec.f1 = MA.masked
+ assert_equal(mrec.f1.mask, [1]*5)
+ assert_equal(mrec['f1_mask'], [1]*5)
+ mrec._mask = MA.masked
+ assert_equal(mrec['f1_mask'], [1]*5)
+ assert_equal(mrec['f0_mask'],mrec['f1_mask'])
+ mrec._mask = MA.nomask
+ assert_equal(mrec['f1_mask'], [0]*5)
+ assert_equal(mrec['f0_mask'],mrec['f1_mask'])
+
+ def test_hardmask(self):
+ "Test hardmask"
+ [d, m, mrec] = self.data
+ print mrec._mask
+ mrec.harden_mask()
+ assert(mrec._hardmask)
+ mrec._mask = nomask
+ assert_equal(mrec._mask, N.r_[[m,m[::-1]]].all(0))
+ mrec.soften_mask()
+ assert(not mrec._hardmask)
+ mrec._mask = nomask
+ assert_equal(mrec['f1_mask'], [0]*5)
+ assert_equal(mrec['f0_mask'],mrec['f1_mask'])
+
+ def test_fromtextfile(self):
+ "Tests reading from a text file."
+ fcontent = """#
+'One (S)','Two (I)','Three (F)','Four (M)','Five (-)','Six (C)'
+'strings',1,1.0,'mixed column',,1
+'with embedded "double quotes"',2,2.0,1.0,,1
+'strings',3,3.0E5,3,,1
+'strings',4,-1e-10,,,1
+"""
+ import os
+ from datetime import datetime
+ fname = 'tmp%s' % datetime.now().strftime("%y%m%d%H%M%S%s")
+ f = open(fname, 'w')
+ f.write(fcontent)
+ f.close()
+ mrectxt = fromtextfile(fname,delimitor=',',varnames='ABCDEFG')
+ os.unlink(fname)
+ #
+ assert(isinstance(mrectxt, mrecarray))
+ assert_equal(mrectxt.F, [1,1,1,1])
+ assert_equal(mrectxt.E._mask, [1,1,1,1])
+ assert_equal(mrectxt.C, [1,2,3.e+5,-1e-10])
+
+ 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)
+ #....................
+ mrecfr = fromrecords(nrec)
+ assert_equal(mrecfr.f0, mrec.f0)
+ assert_equal(mrecfr.dtype, mrec.dtype)
+ #....................
+ tmp = mrec[::-1] #.tolist()
+ mrecfr = fromrecords(tmp)
+ assert_equal(mrecfr.f0, mrec.f0[::-1])
+
+###############################################################################
+#------------------------------------------------------------------------------
+if __name__ == "__main__":
+ NumpyTest().run()
\ No newline at end of file
Modified: trunk/Lib/sandbox/maskedarray/core.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/core.py 2007-03-20 19:31:18 UTC (rev 2860)
+++ trunk/Lib/sandbox/maskedarray/core.py 2007-03-21 21:28:05 UTC (rev 2861)
@@ -990,22 +990,25 @@
DeprecationWarning)
small_mask = flag
# Process data............
- _data = numeric.array(data, dtype=dtype, copy=copy, subok=True)
- _baseclass = getattr(_data, '_baseclass', type(_data))
- if not isinstance(data, MaskedArray) or not subok:
+ _data = numeric.array(data, dtype=dtype, copy=copy, subok=subok)
+ _baseclass = getattr(data, '_baseclass', type(_data))
+ _basedict = getattr(data, '_basedict', getattr(data, '__dict__', None))
+ if not isinstance(data, MaskedArray):
_data = _data.view(cls)
- # Process mask ...........
- # Backwards compat
+ elif not subok:
+ _data = _data.view(cls)
+ else:
+ _data = _data.view(type(data))
+ # Backwards compat .......
if hasattr(data,'_mask') and not isinstance(data, ndarray):
_data._mask = data._mask
- _data._sharedmask = True
+ _sharedmask = True
+ # Process mask ...........
if mask is nomask:
- if _data._mask is not nomask:
- if copy:
- _data._mask = data._mask.copy()
- _data._sharedmask = False
- if not keep_mask:
- _data._mask = nomask
+ if not keep_mask:
+ _data._mask = nomask
+ if copy:
+ _data._mask = _data._mask.copy()
else:
mask = numeric.array(mask, dtype=MaskType, copy=copy)
if mask.shape != _data.shape:
@@ -1018,21 +1021,27 @@
msg = "Mask and data not compatible: data size is %i, "+\
"mask size is %i."
raise MAError, msg % (nd, nm)
- if _data._mask is nomask or not keep_mask:
+ if _data._mask is nomask:
_data._mask = mask
_data._sharedmask = True
else:
- _data._mask = _data._mask.copy()
- _data._mask.__ior__(mask)
+ # Make a copy of the mask to avoid propagation
_data._sharedmask = False
- # Process extra options ..
- # Update fille_value
+ if not keep_mask:
+ _data._mask = mask
+ else:
+ _data._mask = umath.logical_or(mask, _data._mask)
+
+
+ # Update fill_value.......
_data._fill_value = getattr(data, '_fill_value', fill_value)
if _data._fill_value is None:
_data._fill_value = default_fill_value(_data)
+ # Process extra options ..
_data._hardmask = hard_mask
_data._smallmask = small_mask
_data._baseclass = _baseclass
+ _data._basedict = _basedict
return _data
#........................
def __array_finalize__(self,obj):
@@ -1048,6 +1057,10 @@
self._sharedmask = True
self._baseclass = getattr(obj, '_baseclass', type(obj))
self._fill_value = getattr(obj, '_fill_value', None)
+ # Update special attributes ...
+ self._basedict = getattr(obj, '_basedict', getattr(obj, '__dict__', None))
+ if self._basedict is not None:
+ self.__dict__.update(self._basedict)
return
#..................................
def __array_wrap__(self, obj, context=None):
@@ -1179,7 +1192,7 @@
self._mask.flat = newmask
if self._mask.shape:
self._mask = numeric.reshape(self._mask, self.shape)
- _setmask = __setmask__
+ _set_mask = __setmask__
def _get_mask(self):
"""Returns the current mask."""
Modified: trunk/Lib/sandbox/maskedarray/mrecords.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/mrecords.py 2007-03-20 19:31:18 UTC (rev 2860)
+++ trunk/Lib/sandbox/maskedarray/mrecords.py 2007-03-21 21:28:05 UTC (rev 2861)
@@ -226,7 +226,7 @@
# We want a field ........
if isinstance(indx, str):
obj = _data[indx].view(MaskedArray)
- obj._setmask(_localdict['_fieldmask'][indx])
+ obj._set_mask(_localdict['_fieldmask'][indx])
return obj
# We want some elements ..
obj = ndarray.__getitem__(self, indx).view(type(self))
Modified: trunk/Lib/sandbox/maskedarray/tests/test_subclassing.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/tests/test_subclassing.py 2007-03-20 19:31:18 UTC (rev 2860)
+++ trunk/Lib/sandbox/maskedarray/tests/test_subclassing.py 2007-03-21 21:28:05 UTC (rev 2861)
@@ -114,10 +114,15 @@
assert isinstance(z._data, SubArray)
assert z._data.info['added'] > 0
#
- ym._setmask([1,0,0,0,1])
+ ym._set_mask([1,0,0,0,1])
assert_equal(ym._mask, [1,0,0,0,1])
- ym._series._setmask([0,0,0,0,1])
+ ym._series._set_mask([0,0,0,0,1])
assert_equal(ym._mask, [0,0,0,0,1])
+ #
+ xsub = subarray(x, info={'name':'x'})
+ mxsub = masked_array(xsub)
+ assert hasattr(mxsub, 'info')
+ assert_equal(mxsub.info, xsub.info)
def check_subclasspreservation(self):
"Checks that masked_array(...,subok=True) preserves the class."
@@ -126,13 +131,13 @@
xinfo = [(i,j) for (i,j) in zip(x,m)]
xsub = MSubArray(x, mask=m, info={'xsub':xinfo})
#
+ mxsub = masked_array(xsub, subok=False)
+ assert not isinstance(mxsub, MSubArray)
+ assert isinstance(mxsub, MaskedArray)
+ #
mxsub = masked_array(xsub, subok=True)
assert isinstance(mxsub, MSubArray)
assert_equal(mxsub.info, xsub.info)
- #
- mxsub = masked_array(xsub, subok=False)
- assert not isinstance(mxsub, MSubArray)
- assert isinstance(mxsub, MaskedArray)
################################################################################
Modified: trunk/Lib/sandbox/maskedarray/testutils.py
===================================================================
--- trunk/Lib/sandbox/maskedarray/testutils.py 2007-03-20 19:31:18 UTC (rev 2860)
+++ trunk/Lib/sandbox/maskedarray/testutils.py 2007-03-21 21:28:05 UTC (rev 2861)
@@ -178,7 +178,7 @@
number of decimals."""
def compare(x, y):
"Returns the result of the loose comparison between x and y)."
- return approx(x,y)
+ return approx(x,y, rtol=10.**-decimal)
assert_array_compare(compare, x, y, err_msg=err_msg,
header='Arrays are not almost equal')
#............................
More information about the Scipy-svn
mailing list