[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