tmp
/
pip-install-ghxuqwgs
/numpy_78e94bf2b6094bf9a1f3d92042f9bf46
/numpy
/ma
/tests
/test_subclassing.py
# pylint: disable-msg=W0611, W0612, W0511,R0201 | |
"""Tests suite for MaskedArray & subclassing. | |
:author: Pierre Gerard-Marchant | |
:contact: pierregm_at_uga_dot_edu | |
:version: $Id: test_subclassing.py 3473 2007-10-29 15:18:13Z jarrod.millman $ | |
""" | |
from __future__ import division, absolute_import, print_function | |
__author__ = "Pierre GF Gerard-Marchant ($Author: jarrod.millman $)" | |
__version__ = '1.0' | |
__revision__ = "$Revision: 3473 $" | |
__date__ = '$Date: 2007-10-29 17:18:13 +0200 (Mon, 29 Oct 2007) $' | |
import numpy as np | |
from numpy.testing import * | |
from numpy.ma.testutils import * | |
from numpy.ma.core import * | |
class SubArray(np.ndarray): | |
# Defines a generic np.ndarray subclass, that stores some metadata | |
# in the dictionary `info`. | |
def __new__(cls,arr,info={}): | |
x = np.asanyarray(arr).view(cls) | |
x.info = info | |
return x | |
def __array_finalize__(self, obj): | |
self.info = getattr(obj, 'info', {}) | |
return | |
def __add__(self, other): | |
result = np.ndarray.__add__(self, other) | |
result.info.update({'added':result.info.pop('added', 0)+1}) | |
return result | |
subarray = SubArray | |
class MSubArray(SubArray, MaskedArray): | |
def __new__(cls, data, info={}, mask=nomask): | |
subarr = SubArray(data, info) | |
_data = MaskedArray.__new__(cls, data=subarr, mask=mask) | |
_data.info = subarr.info | |
return _data | |
def __array_finalize__(self, obj): | |
MaskedArray.__array_finalize__(self, obj) | |
SubArray.__array_finalize__(self, obj) | |
return | |
def _get_series(self): | |
_view = self.view(MaskedArray) | |
_view._sharedmask = False | |
return _view | |
_series = property(fget=_get_series) | |
msubarray = MSubArray | |
class MMatrix(MaskedArray, np.matrix,): | |
def __new__(cls, data, mask=nomask): | |
mat = np.matrix(data) | |
_data = MaskedArray.__new__(cls, data=mat, mask=mask) | |
return _data | |
def __array_finalize__(self, obj): | |
np.matrix.__array_finalize__(self, obj) | |
MaskedArray.__array_finalize__(self, obj) | |
return | |
def _get_series(self): | |
_view = self.view(MaskedArray) | |
_view._sharedmask = False | |
return _view | |
_series = property(fget=_get_series) | |
mmatrix = MMatrix | |
# also a subclass that overrides __str__, __repr__ and __setitem__, disallowing | |
# setting to non-class values (and thus np.ma.core.masked_print_option) | |
class ComplicatedSubArray(SubArray): | |
def __str__(self): | |
return 'myprefix {0} mypostfix'.format( | |
super(ComplicatedSubArray, self).__str__()) | |
def __repr__(self): | |
# Return a repr that does not start with 'name(' | |
return '<{0} {1}>'.format(self.__class__.__name__, self) | |
def __setitem__(self, item, value): | |
# this ensures direct assignment to masked_print_option will fail | |
if not isinstance(value, ComplicatedSubArray): | |
raise ValueError("Can only set to MySubArray values") | |
super(ComplicatedSubArray, self).__setitem__(item, value) | |
class TestSubclassing(TestCase): | |
# Test suite for masked subclasses of ndarray. | |
def setUp(self): | |
x = np.arange(5) | |
mx = mmatrix(x, mask=[0, 1, 0, 0, 0]) | |
self.data = (x, mx) | |
def test_data_subclassing(self): | |
# Tests whether the subclass is kept. | |
x = np.arange(5) | |
m = [0, 0, 1, 0, 0] | |
xsub = SubArray(x) | |
xmsub = masked_array(xsub, mask=m) | |
self.assertTrue(isinstance(xmsub, MaskedArray)) | |
assert_equal(xmsub._data, xsub) | |
self.assertTrue(isinstance(xmsub._data, SubArray)) | |
def test_maskedarray_subclassing(self): | |
# Tests subclassing MaskedArray | |
(x, mx) = self.data | |
self.assertTrue(isinstance(mx._data, np.matrix)) | |
def test_masked_unary_operations(self): | |
# Tests masked_unary_operation | |
(x, mx) = self.data | |
with np.errstate(divide='ignore'): | |
self.assertTrue(isinstance(log(mx), mmatrix)) | |
assert_equal(log(x), np.log(x)) | |
def test_masked_binary_operations(self): | |
# Tests masked_binary_operation | |
(x, mx) = self.data | |
# Result should be a mmatrix | |
self.assertTrue(isinstance(add(mx, mx), mmatrix)) | |
self.assertTrue(isinstance(add(mx, x), mmatrix)) | |
# Result should work | |
assert_equal(add(mx, x), mx+x) | |
self.assertTrue(isinstance(add(mx, mx)._data, np.matrix)) | |
self.assertTrue(isinstance(add.outer(mx, mx), mmatrix)) | |
self.assertTrue(isinstance(hypot(mx, mx), mmatrix)) | |
self.assertTrue(isinstance(hypot(mx, x), mmatrix)) | |
def test_masked_binary_operations2(self): | |
# Tests domained_masked_binary_operation | |
(x, mx) = self.data | |
xmx = masked_array(mx.data.__array__(), mask=mx.mask) | |
self.assertTrue(isinstance(divide(mx, mx), mmatrix)) | |
self.assertTrue(isinstance(divide(mx, x), mmatrix)) | |
assert_equal(divide(mx, mx), divide(xmx, xmx)) | |
def test_attributepropagation(self): | |
x = array(arange(5), mask=[0]+[1]*4) | |
my = masked_array(subarray(x)) | |
ym = msubarray(x) | |
# | |
z = (my+1) | |
self.assertTrue(isinstance(z, MaskedArray)) | |
self.assertTrue(not isinstance(z, MSubArray)) | |
self.assertTrue(isinstance(z._data, SubArray)) | |
assert_equal(z._data.info, {}) | |
# | |
z = (ym+1) | |
self.assertTrue(isinstance(z, MaskedArray)) | |
self.assertTrue(isinstance(z, MSubArray)) | |
self.assertTrue(isinstance(z._data, SubArray)) | |
self.assertTrue(z._data.info['added'] > 0) | |
# | |
ym._set_mask([1, 0, 0, 0, 1]) | |
assert_equal(ym._mask, [1, 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) | |
self.assertTrue(hasattr(mxsub, 'info')) | |
assert_equal(mxsub.info, xsub.info) | |
def test_subclasspreservation(self): | |
# Checks that masked_array(...,subok=True) preserves the class. | |
x = np.arange(5) | |
m = [0, 0, 1, 0, 0] | |
xinfo = [(i, j) for (i, j) in zip(x, m)] | |
xsub = MSubArray(x, mask=m, info={'xsub':xinfo}) | |
# | |
mxsub = masked_array(xsub, subok=False) | |
self.assertTrue(not isinstance(mxsub, MSubArray)) | |
self.assertTrue(isinstance(mxsub, MaskedArray)) | |
assert_equal(mxsub._mask, m) | |
# | |
mxsub = asarray(xsub) | |
self.assertTrue(not isinstance(mxsub, MSubArray)) | |
self.assertTrue(isinstance(mxsub, MaskedArray)) | |
assert_equal(mxsub._mask, m) | |
# | |
mxsub = masked_array(xsub, subok=True) | |
self.assertTrue(isinstance(mxsub, MSubArray)) | |
assert_equal(mxsub.info, xsub.info) | |
assert_equal(mxsub._mask, xsub._mask) | |
# | |
mxsub = asanyarray(xsub) | |
self.assertTrue(isinstance(mxsub, MSubArray)) | |
assert_equal(mxsub.info, xsub.info) | |
assert_equal(mxsub._mask, m) | |
def test_subclass_repr(self): | |
"""test that repr uses the name of the subclass | |
and 'array' for np.ndarray""" | |
x = np.arange(5) | |
mx = masked_array(x, mask=[True, False, True, False, False]) | |
self.assertTrue(repr(mx).startswith('masked_array')) | |
xsub = SubArray(x) | |
mxsub = masked_array(xsub, mask=[True, False, True, False, False]) | |
self.assertTrue(repr(mxsub).startswith( | |
'masked_{0}(data = [-- 1 -- 3 4]'.format(SubArray.__name__))) | |
def test_subclass_str(self): | |
"""test str with subclass that has overridden str, setitem""" | |
# first without override | |
x = np.arange(5) | |
xsub = SubArray(x) | |
mxsub = masked_array(xsub, mask=[True, False, True, False, False]) | |
self.assertTrue(str(mxsub) == '[-- 1 -- 3 4]') | |
xcsub = ComplicatedSubArray(x) | |
assert_raises(ValueError, xcsub.__setitem__, 0, | |
np.ma.core.masked_print_option) | |
mxcsub = masked_array(xcsub, mask=[True, False, True, False, False]) | |
self.assertTrue(str(mxcsub) == 'myprefix [-- 1 -- 3 4] mypostfix') | |
############################################################################### | |
if __name__ == '__main__': | |
run_module_suite() | |