From 0a476002600cb42068a899f4dc2cf0bc8cdb26d7 Mon Sep 17 00:00:00 2001 From: Shota Kawabuchi Date: Mon, 19 Sep 2016 03:10:22 +0900 Subject: BUG: Look up methods on MaskedArray in _frommethod Fixes #8019 --- numpy/ma/core.py | 23 +++++++++-------------- numpy/ma/tests/test_core.py | 10 ++++++++++ 2 files changed, 19 insertions(+), 14 deletions(-) (limited to 'numpy') diff --git a/numpy/ma/core.py b/numpy/ma/core.py index 1b25725d1..e87460521 100644 --- a/numpy/ma/core.py +++ b/numpy/ma/core.py @@ -6372,21 +6372,16 @@ class _frommethod: def __call__(self, a, *args, **params): if self.reversed: args = list(args) - arr = args[0] - args[0] = a - a = arr - # Get the method from the array (if possible) + a, args[0] = args[0], a + + marr = asanyarray(a) method_name = self.__name__ - method = getattr(a, method_name, None) - if method is not None: - return method(*args, **params) - # Still here ? Then a is not a MaskedArray - method = getattr(MaskedArray, method_name, None) - if method is not None: - return method(MaskedArray(a), *args, **params) - # Still here ? OK, let's call the corresponding np function - method = getattr(np, method_name) - return method(a, *args, **params) + method = getattr(type(marr), method_name, None) + if method is None: + # use the corresponding np function + method = getattr(np, method_name) + + return method(marr, *args, **params) all = _frommethod('all') diff --git a/numpy/ma/tests/test_core.py b/numpy/ma/tests/test_core.py index 9d8002ed0..f9d032f09 100644 --- a/numpy/ma/tests/test_core.py +++ b/numpy/ma/tests/test_core.py @@ -433,6 +433,11 @@ class TestMaskedArray(TestCase): assert_not_equal(y._data.ctypes.data, x._data.ctypes.data) assert_not_equal(y._mask.ctypes.data, x._mask.ctypes.data) + def test_copy_on_python_builtins(self): + # Tests copy works on python builtins (issue#8019) + self.assertTrue(isMaskedArray(np.ma.copy([1,2,3]))) + self.assertTrue(isMaskedArray(np.ma.copy((1,2,3)))) + def test_copy_immutable(self): # Tests that the copy method is immutable, GitHub issue #5247 a = np.ma.array([1, 2, 3]) @@ -1032,6 +1037,11 @@ class TestMaskedArrayArithmetic(TestCase): assert_(res.dtype.type is np.intp) assert_raises(np.AxisError, ott.count, axis=1) + def test_count_on_python_builtins(self): + # Tests count works on python builtins (issue#8019) + assert_equal(3, count([1,2,3])) + assert_equal(2, count((1,2))) + def test_minmax_func(self): # Tests minimum and maximum. (x, y, a10, m1, m2, xm, ym, z, zm, xf) = self.d -- cgit v1.2.1 From 0bc42fc2194c4a7cbc8fa77165e25365e3e46012 Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Wed, 22 Feb 2017 11:48:31 +0000 Subject: BUG: Fix asanyarray, workaround #8666 --- numpy/ma/core.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'numpy') diff --git a/numpy/ma/core.py b/numpy/ma/core.py index e87460521..30ef5dbfc 100644 --- a/numpy/ma/core.py +++ b/numpy/ma/core.py @@ -6530,9 +6530,7 @@ def compressed(x): Equivalent method. """ - if not isinstance(x, MaskedArray): - x = asanyarray(x) - return x.compressed() + return asanyarray(x).compressed() def concatenate(arrays, axis=0): @@ -7678,6 +7676,10 @@ def asanyarray(a, dtype=None): """ + # workaround for #8666, to preserve identity. Ideally the bottom line + # would handle this for us. + if isinstance(a, MaskedArray) and (dtype is None or dtype == a.dtype): + return a return masked_array(a, dtype=dtype, copy=False, keep_mask=True, subok=True) -- cgit v1.2.1