summaryrefslogtreecommitdiff
path: root/numpy/core/ma.py
diff options
context:
space:
mode:
Diffstat (limited to 'numpy/core/ma.py')
-rw-r--r--numpy/core/ma.py88
1 files changed, 42 insertions, 46 deletions
diff --git a/numpy/core/ma.py b/numpy/core/ma.py
index 3c3394599..f32c21d48 100644
--- a/numpy/core/ma.py
+++ b/numpy/core/ma.py
@@ -300,21 +300,16 @@ class masked_unary_operation:
d1 = filled(a, self.fill)
if self.domain is not None:
m = mask_or(m, self.domain(d1))
- if m is None:
- result = self.f(d1, *args, **kwargs)
- if type(result) is ndarray:
- return masked_array (result)
- else:
- return result
- else:
- dx = masked_array(d1, m)
- result = self.f(filled(dx, self.fill), *args, **kwargs)
- if type(result) is ndarray:
- return masked_array(result, m)
- elif m[...]:
- return masked
+ result = self.f(d1, *args, **kwargs)
+ if m is not None:
+ try:
+ shape = result.shape
+ except AttributeError:
+ pass
else:
- return result
+ if m.shape != shape:
+ m = mask_or(getmaskarray(a), getmaskarray(b))
+ return masked_array(result, m)
def __str__ (self):
return "Masked version of " + str(self.f)
@@ -352,21 +347,17 @@ class domained_binary_operation:
d2 = where(t, self.filly, d2)
mb = mask_or(mb, t)
m = mask_or(ma, mb)
- if m is None:
- result = self.f(d1, d2)
- if type(result) is ndarray:
- return masked_array(result)
+ result = self.f(d1, d2)
+ if m is not None:
+ try:
+ shape = result.shape
+ except AttributeError:
+ pass
else:
- return result
- result = self.f(d1, d2)
- if type(result) is ndarray:
- if m.shape != result.shape:
- m = mask_or(getmaskarray(a), getmaskarray(b))
- return masked_array(result, m)
- elif m[...]:
- return masked
- else:
- return result
+ if m.shape != shape:
+ m = mask_or(getmaskarray(a), getmaskarray(b))
+ return masked_array(result, m)
+
def __str__ (self):
return "Masked version of " + str(self.f)
@@ -383,25 +374,18 @@ class masked_binary_operation:
def __call__ (self, a, b, *args, **kwargs):
"Execute the call behavior."
m = mask_or(getmask(a), getmask(b))
- if m is None:
- d1 = filled(a, self.fillx)
- d2 = filled(b, self.filly)
- result = self.f(d1, d2, *args, **kwargs)
- if type(result) is ndarray:
- return masked_array(result)
- else:
- return result
d1 = filled(a, self.fillx)
d2 = filled(b, self.filly)
result = self.f(d1, d2, *args, **kwargs)
- if type(result) is ndarray:
- if m.shape != result.shape:
- m = mask_or(getmaskarray(a), getmaskarray(b))
- return masked_array(result, m)
- elif m[...]:
- return masked
- else:
- return result
+ if m is not None:
+ try:
+ shape = result.shape
+ except AttributeError:
+ pass
+ else:
+ if m.shape != shape:
+ m = mask_or(getmaskarray(a), getmaskarray(b))
+ return masked_array(result, m)
def reduce (self, target, axis=0):
"""Reduce target along the given axis with this function."""
@@ -833,6 +817,18 @@ array(data = %(data)s,
self._shared_mask = False
self._mask[i:j] = m
+ def __nonzero__(self):
+ """returns true if any element is non-zero or masked
+
+ """
+ # XXX: This changes bool conversion logic from MA.
+ # XXX: In MA bool(a) == len(a) != 0, but in scipy
+ # XXX: scalars do not have len
+ m = self._mask
+ d = self._data
+ return bool(m is not None and m.any()
+ or d is not None and d.any())
+
def __len__ (self):
"""Return length of first dimension. This is weird but Python's
slicing behavior depends on it."""
@@ -1905,7 +1901,7 @@ class _minimum_operation:
else:
return amin(ac.raw_data())
else:
- return where(less(a, b), a, b)[...]
+ return where(less(a, b), a, b)
def reduce (self, target, axis=0):
"""Reduce target along the given axis."""
@@ -1954,7 +1950,7 @@ class _maximum_operation:
else:
return amax(ac.raw_data())
else:
- return where(greater(a, b), a, b)[...]
+ return where(greater(a, b), a, b)
def reduce (self, target, axis=0):
"""Reduce target along the given axis."""