You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					444 lines
				
				15 KiB
			
		
		
			
		
	
	
					444 lines
				
				15 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								import timeit
							 | 
						||
| 
								 | 
							
								from functools import reduce
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import numpy as np
							 | 
						||
| 
								 | 
							
								from numpy import float_
							 | 
						||
| 
								 | 
							
								import numpy.core.fromnumeric as fromnumeric
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from numpy.testing import build_err_msg
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pi = np.pi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class ModuleTester:
							 | 
						||
| 
								 | 
							
								    def __init__(self, module):
							 | 
						||
| 
								 | 
							
								        self.module = module
							 | 
						||
| 
								 | 
							
								        self.allequal = module.allequal
							 | 
						||
| 
								 | 
							
								        self.arange = module.arange
							 | 
						||
| 
								 | 
							
								        self.array = module.array
							 | 
						||
| 
								 | 
							
								        self.concatenate = module.concatenate
							 | 
						||
| 
								 | 
							
								        self.count = module.count
							 | 
						||
| 
								 | 
							
								        self.equal = module.equal
							 | 
						||
| 
								 | 
							
								        self.filled = module.filled
							 | 
						||
| 
								 | 
							
								        self.getmask = module.getmask
							 | 
						||
| 
								 | 
							
								        self.getmaskarray = module.getmaskarray
							 | 
						||
| 
								 | 
							
								        self.id = id
							 | 
						||
| 
								 | 
							
								        self.inner = module.inner
							 | 
						||
| 
								 | 
							
								        self.make_mask = module.make_mask
							 | 
						||
| 
								 | 
							
								        self.masked = module.masked
							 | 
						||
| 
								 | 
							
								        self.masked_array = module.masked_array
							 | 
						||
| 
								 | 
							
								        self.masked_values = module.masked_values
							 | 
						||
| 
								 | 
							
								        self.mask_or = module.mask_or
							 | 
						||
| 
								 | 
							
								        self.nomask = module.nomask
							 | 
						||
| 
								 | 
							
								        self.ones = module.ones
							 | 
						||
| 
								 | 
							
								        self.outer = module.outer
							 | 
						||
| 
								 | 
							
								        self.repeat = module.repeat
							 | 
						||
| 
								 | 
							
								        self.resize = module.resize
							 | 
						||
| 
								 | 
							
								        self.sort = module.sort
							 | 
						||
| 
								 | 
							
								        self.take = module.take
							 | 
						||
| 
								 | 
							
								        self.transpose = module.transpose
							 | 
						||
| 
								 | 
							
								        self.zeros = module.zeros
							 | 
						||
| 
								 | 
							
								        self.MaskType = module.MaskType
							 | 
						||
| 
								 | 
							
								        try:
							 | 
						||
| 
								 | 
							
								            self.umath = module.umath
							 | 
						||
| 
								 | 
							
								        except AttributeError:
							 | 
						||
| 
								 | 
							
								            self.umath = module.core.umath
							 | 
						||
| 
								 | 
							
								        self.testnames = []
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def assert_array_compare(self, comparison, x, y, err_msg='', header='',
							 | 
						||
| 
								 | 
							
								                         fill_value=True):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Assert that a comparison of two masked arrays is satisfied elementwise.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        xf = self.filled(x)
							 | 
						||
| 
								 | 
							
								        yf = self.filled(y)
							 | 
						||
| 
								 | 
							
								        m = self.mask_or(self.getmask(x), self.getmask(y))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        x = self.filled(self.masked_array(xf, mask=m), fill_value)
							 | 
						||
| 
								 | 
							
								        y = self.filled(self.masked_array(yf, mask=m), fill_value)
							 | 
						||
| 
								 | 
							
								        if (x.dtype.char != "O"):
							 | 
						||
| 
								 | 
							
								            x = x.astype(float_)
							 | 
						||
| 
								 | 
							
								            if isinstance(x, np.ndarray) and x.size > 1:
							 | 
						||
| 
								 | 
							
								                x[np.isnan(x)] = 0
							 | 
						||
| 
								 | 
							
								            elif np.isnan(x):
							 | 
						||
| 
								 | 
							
								                x = 0
							 | 
						||
| 
								 | 
							
								        if (y.dtype.char != "O"):
							 | 
						||
| 
								 | 
							
								            y = y.astype(float_)
							 | 
						||
| 
								 | 
							
								            if isinstance(y, np.ndarray) and y.size > 1:
							 | 
						||
| 
								 | 
							
								                y[np.isnan(y)] = 0
							 | 
						||
| 
								 | 
							
								            elif np.isnan(y):
							 | 
						||
| 
								 | 
							
								                y = 0
							 | 
						||
| 
								 | 
							
								        try:
							 | 
						||
| 
								 | 
							
								            cond = (x.shape == () or y.shape == ()) or x.shape == y.shape
							 | 
						||
| 
								 | 
							
								            if not cond:
							 | 
						||
| 
								 | 
							
								                msg = build_err_msg([x, y],
							 | 
						||
| 
								 | 
							
								                                    err_msg
							 | 
						||
| 
								 | 
							
								                                    + f'\n(shapes {x.shape}, {y.shape} mismatch)',
							 | 
						||
| 
								 | 
							
								                                    header=header,
							 | 
						||
| 
								 | 
							
								                                    names=('x', 'y'))
							 | 
						||
| 
								 | 
							
								                assert cond, msg
							 | 
						||
| 
								 | 
							
								            val = comparison(x, y)
							 | 
						||
| 
								 | 
							
								            if m is not self.nomask and fill_value:
							 | 
						||
| 
								 | 
							
								                val = self.masked_array(val, mask=m)
							 | 
						||
| 
								 | 
							
								            if isinstance(val, bool):
							 | 
						||
| 
								 | 
							
								                cond = val
							 | 
						||
| 
								 | 
							
								                reduced = [0]
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                reduced = val.ravel()
							 | 
						||
| 
								 | 
							
								                cond = reduced.all()
							 | 
						||
| 
								 | 
							
								                reduced = reduced.tolist()
							 | 
						||
| 
								 | 
							
								            if not cond:
							 | 
						||
| 
								 | 
							
								                match = 100-100.0*reduced.count(1)/len(reduced)
							 | 
						||
| 
								 | 
							
								                msg = build_err_msg([x, y],
							 | 
						||
| 
								 | 
							
								                                    err_msg
							 | 
						||
| 
								 | 
							
								                                    + '\n(mismatch %s%%)' % (match,),
							 | 
						||
| 
								 | 
							
								                                    header=header,
							 | 
						||
| 
								 | 
							
								                                    names=('x', 'y'))
							 | 
						||
| 
								 | 
							
								                assert cond, msg
							 | 
						||
| 
								 | 
							
								        except ValueError as e:
							 | 
						||
| 
								 | 
							
								            msg = build_err_msg([x, y], err_msg, header=header, names=('x', 'y'))
							 | 
						||
| 
								 | 
							
								            raise ValueError(msg) from e
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def assert_array_equal(self, x, y, err_msg=''):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Checks the elementwise equality of two masked arrays.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        self.assert_array_compare(self.equal, x, y, err_msg=err_msg,
							 | 
						||
| 
								 | 
							
								                                  header='Arrays are not equal')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @np.errstate(all='ignore')
							 | 
						||
| 
								 | 
							
								    def test_0(self):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Tests creation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        x = np.array([1., 1., 1., -2., pi/2.0, 4., 5., -10., 10., 1., 2., 3.])
							 | 
						||
| 
								 | 
							
								        m = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
							 | 
						||
| 
								 | 
							
								        xm = self.masked_array(x, mask=m)
							 | 
						||
| 
								 | 
							
								        xm[0]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @np.errstate(all='ignore')
							 | 
						||
| 
								 | 
							
								    def test_1(self):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Tests creation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        x = np.array([1., 1., 1., -2., pi/2.0, 4., 5., -10., 10., 1., 2., 3.])
							 | 
						||
| 
								 | 
							
								        y = np.array([5., 0., 3., 2., -1., -4., 0., -10., 10., 1., 0., 3.])
							 | 
						||
| 
								 | 
							
								        m1 = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
							 | 
						||
| 
								 | 
							
								        m2 = [0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1]
							 | 
						||
| 
								 | 
							
								        xm = self.masked_array(x, mask=m1)
							 | 
						||
| 
								 | 
							
								        ym = self.masked_array(y, mask=m2)
							 | 
						||
| 
								 | 
							
								        xf = np.where(m1, 1.e+20, x)
							 | 
						||
| 
								 | 
							
								        xm.set_fill_value(1.e+20)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        assert((xm-ym).filled(0).any())
							 | 
						||
| 
								 | 
							
								        s = x.shape
							 | 
						||
| 
								 | 
							
								        assert(xm.size == reduce(lambda x, y:x*y, s))
							 | 
						||
| 
								 | 
							
								        assert(self.count(xm) == len(m1) - reduce(lambda x, y:x+y, m1))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        for s in [(4, 3), (6, 2)]:
							 | 
						||
| 
								 | 
							
								            x.shape = s
							 | 
						||
| 
								 | 
							
								            y.shape = s
							 | 
						||
| 
								 | 
							
								            xm.shape = s
							 | 
						||
| 
								 | 
							
								            ym.shape = s
							 | 
						||
| 
								 | 
							
								            xf.shape = s
							 | 
						||
| 
								 | 
							
								            assert(self.count(xm) == len(m1) - reduce(lambda x, y:x+y, m1))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @np.errstate(all='ignore')
							 | 
						||
| 
								 | 
							
								    def test_2(self):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Tests conversions and indexing.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        x1 = np.array([1, 2, 4, 3])
							 | 
						||
| 
								 | 
							
								        x2 = self.array(x1, mask=[1, 0, 0, 0])
							 | 
						||
| 
								 | 
							
								        x3 = self.array(x1, mask=[0, 1, 0, 1])
							 | 
						||
| 
								 | 
							
								        x4 = self.array(x1)
							 | 
						||
| 
								 | 
							
								        # test conversion to strings, no errors
							 | 
						||
| 
								 | 
							
								        str(x2)
							 | 
						||
| 
								 | 
							
								        repr(x2)
							 | 
						||
| 
								 | 
							
								        # tests of indexing
							 | 
						||
| 
								 | 
							
								        assert type(x2[1]) is type(x1[1])
							 | 
						||
| 
								 | 
							
								        assert x1[1] == x2[1]
							 | 
						||
| 
								 | 
							
								        x1[2] = 9
							 | 
						||
| 
								 | 
							
								        x2[2] = 9
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(x1, x2)
							 | 
						||
| 
								 | 
							
								        x1[1:3] = 99
							 | 
						||
| 
								 | 
							
								        x2[1:3] = 99
							 | 
						||
| 
								 | 
							
								        x2[1] = self.masked
							 | 
						||
| 
								 | 
							
								        x2[1:3] = self.masked
							 | 
						||
| 
								 | 
							
								        x2[:] = x1
							 | 
						||
| 
								 | 
							
								        x2[1] = self.masked
							 | 
						||
| 
								 | 
							
								        x3[:] = self.masked_array([1, 2, 3, 4], [0, 1, 1, 0])
							 | 
						||
| 
								 | 
							
								        x4[:] = self.masked_array([1, 2, 3, 4], [0, 1, 1, 0])
							 | 
						||
| 
								 | 
							
								        x1 = np.arange(5)*1.0
							 | 
						||
| 
								 | 
							
								        x2 = self.masked_values(x1, 3.0)
							 | 
						||
| 
								 | 
							
								        x1 = self.array([1, 'hello', 2, 3], object)
							 | 
						||
| 
								 | 
							
								        x2 = np.array([1, 'hello', 2, 3], object)
							 | 
						||
| 
								 | 
							
								        # check that no error occurs.
							 | 
						||
| 
								 | 
							
								        x1[1]
							 | 
						||
| 
								 | 
							
								        x2[1]
							 | 
						||
| 
								 | 
							
								        assert x1[1:1].shape == (0,)
							 | 
						||
| 
								 | 
							
								        # Tests copy-size
							 | 
						||
| 
								 | 
							
								        n = [0, 0, 1, 0, 0]
							 | 
						||
| 
								 | 
							
								        m = self.make_mask(n)
							 | 
						||
| 
								 | 
							
								        m2 = self.make_mask(m)
							 | 
						||
| 
								 | 
							
								        assert(m is m2)
							 | 
						||
| 
								 | 
							
								        m3 = self.make_mask(m, copy=1)
							 | 
						||
| 
								 | 
							
								        assert(m is not m3)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @np.errstate(all='ignore')
							 | 
						||
| 
								 | 
							
								    def test_3(self):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Tests resize/repeat
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        x4 = self.arange(4)
							 | 
						||
| 
								 | 
							
								        x4[2] = self.masked
							 | 
						||
| 
								 | 
							
								        y4 = self.resize(x4, (8,))
							 | 
						||
| 
								 | 
							
								        assert self.allequal(self.concatenate([x4, x4]), y4)
							 | 
						||
| 
								 | 
							
								        assert self.allequal(self.getmask(y4), [0, 0, 1, 0, 0, 0, 1, 0])
							 | 
						||
| 
								 | 
							
								        y5 = self.repeat(x4, (2, 2, 2, 2), axis=0)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(y5, [0, 0, 1, 1, 2, 2, 3, 3])
							 | 
						||
| 
								 | 
							
								        y6 = self.repeat(x4, 2, axis=0)
							 | 
						||
| 
								 | 
							
								        assert self.allequal(y5, y6)
							 | 
						||
| 
								 | 
							
								        y7 = x4.repeat((2, 2, 2, 2), axis=0)
							 | 
						||
| 
								 | 
							
								        assert self.allequal(y5, y7)
							 | 
						||
| 
								 | 
							
								        y8 = x4.repeat(2, 0)
							 | 
						||
| 
								 | 
							
								        assert self.allequal(y5, y8)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @np.errstate(all='ignore')
							 | 
						||
| 
								 | 
							
								    def test_4(self):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Test of take, transpose, inner, outer products.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        x = self.arange(24)
							 | 
						||
| 
								 | 
							
								        y = np.arange(24)
							 | 
						||
| 
								 | 
							
								        x[5:6] = self.masked
							 | 
						||
| 
								 | 
							
								        x = x.reshape(2, 3, 4)
							 | 
						||
| 
								 | 
							
								        y = y.reshape(2, 3, 4)
							 | 
						||
| 
								 | 
							
								        assert self.allequal(np.transpose(y, (2, 0, 1)), self.transpose(x, (2, 0, 1)))
							 | 
						||
| 
								 | 
							
								        assert self.allequal(np.take(y, (2, 0, 1), 1), self.take(x, (2, 0, 1), 1))
							 | 
						||
| 
								 | 
							
								        assert self.allequal(np.inner(self.filled(x, 0), self.filled(y, 0)),
							 | 
						||
| 
								 | 
							
								                            self.inner(x, y))
							 | 
						||
| 
								 | 
							
								        assert self.allequal(np.outer(self.filled(x, 0), self.filled(y, 0)),
							 | 
						||
| 
								 | 
							
								                            self.outer(x, y))
							 | 
						||
| 
								 | 
							
								        y = self.array(['abc', 1, 'def', 2, 3], object)
							 | 
						||
| 
								 | 
							
								        y[2] = self.masked
							 | 
						||
| 
								 | 
							
								        t = self.take(y, [0, 3, 4])
							 | 
						||
| 
								 | 
							
								        assert t[0] == 'abc'
							 | 
						||
| 
								 | 
							
								        assert t[1] == 2
							 | 
						||
| 
								 | 
							
								        assert t[2] == 3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @np.errstate(all='ignore')
							 | 
						||
| 
								 | 
							
								    def test_5(self):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Tests inplace w/ scalar
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        x = self.arange(10)
							 | 
						||
| 
								 | 
							
								        y = self.arange(10)
							 | 
						||
| 
								 | 
							
								        xm = self.arange(10)
							 | 
						||
| 
								 | 
							
								        xm[2] = self.masked
							 | 
						||
| 
								 | 
							
								        x += 1
							 | 
						||
| 
								 | 
							
								        assert self.allequal(x, y+1)
							 | 
						||
| 
								 | 
							
								        xm += 1
							 | 
						||
| 
								 | 
							
								        assert self.allequal(xm, y+1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        x = self.arange(10)
							 | 
						||
| 
								 | 
							
								        xm = self.arange(10)
							 | 
						||
| 
								 | 
							
								        xm[2] = self.masked
							 | 
						||
| 
								 | 
							
								        x -= 1
							 | 
						||
| 
								 | 
							
								        assert self.allequal(x, y-1)
							 | 
						||
| 
								 | 
							
								        xm -= 1
							 | 
						||
| 
								 | 
							
								        assert self.allequal(xm, y-1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        x = self.arange(10)*1.0
							 | 
						||
| 
								 | 
							
								        xm = self.arange(10)*1.0
							 | 
						||
| 
								 | 
							
								        xm[2] = self.masked
							 | 
						||
| 
								 | 
							
								        x *= 2.0
							 | 
						||
| 
								 | 
							
								        assert self.allequal(x, y*2)
							 | 
						||
| 
								 | 
							
								        xm *= 2.0
							 | 
						||
| 
								 | 
							
								        assert self.allequal(xm, y*2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        x = self.arange(10)*2
							 | 
						||
| 
								 | 
							
								        xm = self.arange(10)*2
							 | 
						||
| 
								 | 
							
								        xm[2] = self.masked
							 | 
						||
| 
								 | 
							
								        x /= 2
							 | 
						||
| 
								 | 
							
								        assert self.allequal(x, y)
							 | 
						||
| 
								 | 
							
								        xm /= 2
							 | 
						||
| 
								 | 
							
								        assert self.allequal(xm, y)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        x = self.arange(10)*1.0
							 | 
						||
| 
								 | 
							
								        xm = self.arange(10)*1.0
							 | 
						||
| 
								 | 
							
								        xm[2] = self.masked
							 | 
						||
| 
								 | 
							
								        x /= 2.0
							 | 
						||
| 
								 | 
							
								        assert self.allequal(x, y/2.0)
							 | 
						||
| 
								 | 
							
								        xm /= self.arange(10)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(xm, self.ones((10,)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        x = self.arange(10).astype(float_)
							 | 
						||
| 
								 | 
							
								        xm = self.arange(10)
							 | 
						||
| 
								 | 
							
								        xm[2] = self.masked
							 | 
						||
| 
								 | 
							
								        x += 1.
							 | 
						||
| 
								 | 
							
								        assert self.allequal(x, y + 1.)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @np.errstate(all='ignore')
							 | 
						||
| 
								 | 
							
								    def test_6(self):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Tests inplace w/ array
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        x = self.arange(10, dtype=float_)
							 | 
						||
| 
								 | 
							
								        y = self.arange(10)
							 | 
						||
| 
								 | 
							
								        xm = self.arange(10, dtype=float_)
							 | 
						||
| 
								 | 
							
								        xm[2] = self.masked
							 | 
						||
| 
								 | 
							
								        m = xm.mask
							 | 
						||
| 
								 | 
							
								        a = self.arange(10, dtype=float_)
							 | 
						||
| 
								 | 
							
								        a[-1] = self.masked
							 | 
						||
| 
								 | 
							
								        x += a
							 | 
						||
| 
								 | 
							
								        xm += a
							 | 
						||
| 
								 | 
							
								        assert self.allequal(x, y+a)
							 | 
						||
| 
								 | 
							
								        assert self.allequal(xm, y+a)
							 | 
						||
| 
								 | 
							
								        assert self.allequal(xm.mask, self.mask_or(m, a.mask))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        x = self.arange(10, dtype=float_)
							 | 
						||
| 
								 | 
							
								        xm = self.arange(10, dtype=float_)
							 | 
						||
| 
								 | 
							
								        xm[2] = self.masked
							 | 
						||
| 
								 | 
							
								        m = xm.mask
							 | 
						||
| 
								 | 
							
								        a = self.arange(10, dtype=float_)
							 | 
						||
| 
								 | 
							
								        a[-1] = self.masked
							 | 
						||
| 
								 | 
							
								        x -= a
							 | 
						||
| 
								 | 
							
								        xm -= a
							 | 
						||
| 
								 | 
							
								        assert self.allequal(x, y-a)
							 | 
						||
| 
								 | 
							
								        assert self.allequal(xm, y-a)
							 | 
						||
| 
								 | 
							
								        assert self.allequal(xm.mask, self.mask_or(m, a.mask))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        x = self.arange(10, dtype=float_)
							 | 
						||
| 
								 | 
							
								        xm = self.arange(10, dtype=float_)
							 | 
						||
| 
								 | 
							
								        xm[2] = self.masked
							 | 
						||
| 
								 | 
							
								        m = xm.mask
							 | 
						||
| 
								 | 
							
								        a = self.arange(10, dtype=float_)
							 | 
						||
| 
								 | 
							
								        a[-1] = self.masked
							 | 
						||
| 
								 | 
							
								        x *= a
							 | 
						||
| 
								 | 
							
								        xm *= a
							 | 
						||
| 
								 | 
							
								        assert self.allequal(x, y*a)
							 | 
						||
| 
								 | 
							
								        assert self.allequal(xm, y*a)
							 | 
						||
| 
								 | 
							
								        assert self.allequal(xm.mask, self.mask_or(m, a.mask))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        x = self.arange(10, dtype=float_)
							 | 
						||
| 
								 | 
							
								        xm = self.arange(10, dtype=float_)
							 | 
						||
| 
								 | 
							
								        xm[2] = self.masked
							 | 
						||
| 
								 | 
							
								        m = xm.mask
							 | 
						||
| 
								 | 
							
								        a = self.arange(10, dtype=float_)
							 | 
						||
| 
								 | 
							
								        a[-1] = self.masked
							 | 
						||
| 
								 | 
							
								        x /= a
							 | 
						||
| 
								 | 
							
								        xm /= a
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @np.errstate(all='ignore')
							 | 
						||
| 
								 | 
							
								    def test_7(self):
							 | 
						||
| 
								 | 
							
								        "Tests ufunc"
							 | 
						||
| 
								 | 
							
								        d = (self.array([1.0, 0, -1, pi/2]*2, mask=[0, 1]+[0]*6),
							 | 
						||
| 
								 | 
							
								             self.array([1.0, 0, -1, pi/2]*2, mask=[1, 0]+[0]*6),)
							 | 
						||
| 
								 | 
							
								        for f in ['sqrt', 'log', 'log10', 'exp', 'conjugate',
							 | 
						||
| 
								 | 
							
								#                  'sin', 'cos', 'tan',
							 | 
						||
| 
								 | 
							
								#                  'arcsin', 'arccos', 'arctan',
							 | 
						||
| 
								 | 
							
								#                  'sinh', 'cosh', 'tanh',
							 | 
						||
| 
								 | 
							
								#                  'arcsinh',
							 | 
						||
| 
								 | 
							
								#                  'arccosh',
							 | 
						||
| 
								 | 
							
								#                  'arctanh',
							 | 
						||
| 
								 | 
							
								#                  'absolute', 'fabs', 'negative',
							 | 
						||
| 
								 | 
							
								#                  # 'nonzero', 'around',
							 | 
						||
| 
								 | 
							
								#                  'floor', 'ceil',
							 | 
						||
| 
								 | 
							
								#                  # 'sometrue', 'alltrue',
							 | 
						||
| 
								 | 
							
								#                  'logical_not',
							 | 
						||
| 
								 | 
							
								#                  'add', 'subtract', 'multiply',
							 | 
						||
| 
								 | 
							
								#                  'divide', 'true_divide', 'floor_divide',
							 | 
						||
| 
								 | 
							
								#                  'remainder', 'fmod', 'hypot', 'arctan2',
							 | 
						||
| 
								 | 
							
								#                  'equal', 'not_equal', 'less_equal', 'greater_equal',
							 | 
						||
| 
								 | 
							
								#                  'less', 'greater',
							 | 
						||
| 
								 | 
							
								#                  'logical_and', 'logical_or', 'logical_xor',
							 | 
						||
| 
								 | 
							
								                  ]:
							 | 
						||
| 
								 | 
							
								            try:
							 | 
						||
| 
								 | 
							
								                uf = getattr(self.umath, f)
							 | 
						||
| 
								 | 
							
								            except AttributeError:
							 | 
						||
| 
								 | 
							
								                uf = getattr(fromnumeric, f)
							 | 
						||
| 
								 | 
							
								            mf = getattr(self.module, f)
							 | 
						||
| 
								 | 
							
								            args = d[:uf.nin]
							 | 
						||
| 
								 | 
							
								            ur = uf(*args)
							 | 
						||
| 
								 | 
							
								            mr = mf(*args)
							 | 
						||
| 
								 | 
							
								            self.assert_array_equal(ur.filled(0), mr.filled(0), f)
							 | 
						||
| 
								 | 
							
								            self.assert_array_equal(ur._mask, mr._mask)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @np.errstate(all='ignore')
							 | 
						||
| 
								 | 
							
								    def test_99(self):
							 | 
						||
| 
								 | 
							
								        # test average
							 | 
						||
| 
								 | 
							
								        ott = self.array([0., 1., 2., 3.], mask=[1, 0, 0, 0])
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(2.0, self.average(ott, axis=0))
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(2.0, self.average(ott, weights=[1., 1., 2., 1.]))
							 | 
						||
| 
								 | 
							
								        result, wts = self.average(ott, weights=[1., 1., 2., 1.], returned=1)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(2.0, result)
							 | 
						||
| 
								 | 
							
								        assert(wts == 4.0)
							 | 
						||
| 
								 | 
							
								        ott[:] = self.masked
							 | 
						||
| 
								 | 
							
								        assert(self.average(ott, axis=0) is self.masked)
							 | 
						||
| 
								 | 
							
								        ott = self.array([0., 1., 2., 3.], mask=[1, 0, 0, 0])
							 | 
						||
| 
								 | 
							
								        ott = ott.reshape(2, 2)
							 | 
						||
| 
								 | 
							
								        ott[:, 1] = self.masked
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(ott, axis=0), [2.0, 0.0])
							 | 
						||
| 
								 | 
							
								        assert(self.average(ott, axis=1)[0] is self.masked)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal([2., 0.], self.average(ott, axis=0))
							 | 
						||
| 
								 | 
							
								        result, wts = self.average(ott, axis=0, returned=1)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(wts, [1., 0.])
							 | 
						||
| 
								 | 
							
								        w1 = [0, 1, 1, 1, 1, 0]
							 | 
						||
| 
								 | 
							
								        w2 = [[0, 1, 1, 1, 1, 0], [1, 0, 0, 0, 0, 1]]
							 | 
						||
| 
								 | 
							
								        x = self.arange(6)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(x, axis=0), 2.5)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(x, axis=0, weights=w1), 2.5)
							 | 
						||
| 
								 | 
							
								        y = self.array([self.arange(6), 2.0*self.arange(6)])
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(y, None), np.add.reduce(np.arange(6))*3./12.)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(y, axis=0), np.arange(6) * 3./2.)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(y, axis=1), [self.average(x, axis=0), self.average(x, axis=0) * 2.0])
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(y, None, weights=w2), 20./6.)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(y, axis=0, weights=w2), [0., 1., 2., 3., 4., 10.])
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(y, axis=1), [self.average(x, axis=0), self.average(x, axis=0) * 2.0])
							 | 
						||
| 
								 | 
							
								        m1 = self.zeros(6)
							 | 
						||
| 
								 | 
							
								        m2 = [0, 0, 1, 1, 0, 0]
							 | 
						||
| 
								 | 
							
								        m3 = [[0, 0, 1, 1, 0, 0], [0, 1, 1, 1, 1, 0]]
							 | 
						||
| 
								 | 
							
								        m4 = self.ones(6)
							 | 
						||
| 
								 | 
							
								        m5 = [0, 1, 1, 1, 1, 1]
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(self.masked_array(x, m1), axis=0), 2.5)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(self.masked_array(x, m2), axis=0), 2.5)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(self.masked_array(x, m5), axis=0), 0.0)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.count(self.average(self.masked_array(x, m4), axis=0)), 0)
							 | 
						||
| 
								 | 
							
								        z = self.masked_array(y, m3)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(z, None), 20./6.)
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(z, axis=0), [0., 1., 99., 99., 4.0, 7.5])
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(z, axis=1), [2.5, 5.0])
							 | 
						||
| 
								 | 
							
								        self.assert_array_equal(self.average(z, axis=0, weights=w2), [0., 1., 99., 99., 4.0, 10.0])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @np.errstate(all='ignore')
							 | 
						||
| 
								 | 
							
								    def test_A(self):
							 | 
						||
| 
								 | 
							
								        x = self.arange(24)
							 | 
						||
| 
								 | 
							
								        x[5:6] = self.masked
							 | 
						||
| 
								 | 
							
								        x = x.reshape(2, 3, 4)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == '__main__':
							 | 
						||
| 
								 | 
							
								    setup_base = ("from __main__ import ModuleTester \n"
							 | 
						||
| 
								 | 
							
								                  "import numpy\n"
							 | 
						||
| 
								 | 
							
								                  "tester = ModuleTester(module)\n")
							 | 
						||
| 
								 | 
							
								    setup_cur = "import numpy.ma.core as module\n" + setup_base
							 | 
						||
| 
								 | 
							
								    (nrepeat, nloop) = (10, 10)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for i in range(1, 8):
							 | 
						||
| 
								 | 
							
								        func = 'tester.test_%i()' % i
							 | 
						||
| 
								 | 
							
								        cur = timeit.Timer(func, setup_cur).repeat(nrepeat, nloop*10)
							 | 
						||
| 
								 | 
							
								        cur = np.sort(cur)
							 | 
						||
| 
								 | 
							
								        print("#%i" % i + 50*'.')
							 | 
						||
| 
								 | 
							
								        print(eval("ModuleTester.test_%i.__doc__" % i))
							 | 
						||
| 
								 | 
							
								        print(f'core_current : {cur[0]:.3f} - {cur[1]:.3f}')
							 |