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