def test_setattr(self): dat = AttrArray(np.random.rand(10),name='randvals') # add a custom attribute: dat.custom = 'attribute' self.assertEquals(dat.custom,'attribute') # _required_attrs is read only: self.assertRaises(AttributeError,dat.__setattr__,'_required_attrs','test')
def test_setattr(self): dat = AttrArray(np.random.rand(10), name='randvals') # add a custom attribute: dat.custom = 'attribute' self.assertEquals(dat.custom, 'attribute') # _required_attrs is read only: self.assertRaises(AttributeError, dat.__setattr__, '_required_attrs', 'test')
def test_pickle(self): # make sure we can pickle this thing dat = AttrArray(np.random.rand(10), name='randvals') # dump to string pstr = pickle.dumps(dat) # load to new variable dat2 = pickle.loads(pstr) # make sure data same assert_array_equal(dat, dat2) # make sure has attr and it's correct self.assertTrue(hasattr(dat2, '_attrs')) self.assertTrue(hasattr(dat2, 'name')) self.assertEquals(dat2.name, 'randvals') # make sure has required attr self.assertTrue(hasattr(dat2, '_required_attrs'))
def test_nanmean(self): arr = np.random.rand(10,10,10) dat = AttrArray(arr,name='randvals') # if there are no NaN's, mean and nanmean should give equal # results: self.assertEquals(dat.mean(),dat.nanmean()) assert_array_almost_equal(dat.mean(0),dat.nanmean(0)) self.assertEquals(dat.nanmean(0).name, 'randvals') assert_array_almost_equal(dat.mean(1),dat.nanmean(1)) self.assertEquals(dat.nanmean(1).name, 'randvals') assert_array_almost_equal(dat.mean(2),dat.nanmean(2)) self.assertEquals(dat.nanmean(2).name, 'randvals') # Now, make sure results are as expected with NaN present: arr[0,0,0] = np.nan dat = AttrArray(arr,name='randvals') self.assertEquals(dat[~np.isnan(dat)].mean(),dat.nanmean()) for i in range(len(arr.shape)): tmp1 = dat.mean(i) tmp1[0,0] = 0 tmp2 = dat.nanmean(i) tmp2[0,0] = 0 assert_array_almost_equal(tmp1,tmp2) self.assertEquals(tmp2.name, 'randvals') arr[3,6,2] = np.nan dat = AttrArray(arr,name='randvals') self.assertEquals(dat[~np.isnan(dat)].mean(),dat.nanmean()) tmp1 = dat.mean(0) tmp1[0,0] = 0 tmp1[6,2] = 0 tmp2 = dat.nanmean(0) tmp2[0,0] = 0 tmp2[6,2] = 0 assert_array_almost_equal(tmp1,tmp2) self.assertEquals(tmp2.name, 'randvals') tmp1 = dat.mean(1) tmp1[0,0] = 0 tmp1[3,2] = 0 tmp2 = dat.nanmean(1) tmp2[0,0] = 0 tmp2[3,2] = 0 assert_array_almost_equal(tmp1,tmp2) self.assertEquals(tmp2.name, 'randvals') tmp1 = dat.mean(2) tmp1[0,0] = 0 tmp1[3,6] = 0 tmp2 = dat.nanmean(2) tmp2[0,0] = 0 tmp2[3,6] = 0 assert_array_almost_equal(tmp1,tmp2) self.assertEquals(tmp2.name, 'randvals')
def test_nanmean(self): arr = np.random.rand(10, 10, 10) dat = AttrArray(arr, name='randvals') # if there are no NaN's, mean and nanmean should give equal # results: self.assertEquals(dat.mean(), dat.nanmean()) assert_array_almost_equal(dat.mean(0), dat.nanmean(0)) self.assertEquals(dat.nanmean(0).name, 'randvals') assert_array_almost_equal(dat.mean(1), dat.nanmean(1)) self.assertEquals(dat.nanmean(1).name, 'randvals') assert_array_almost_equal(dat.mean(2), dat.nanmean(2)) self.assertEquals(dat.nanmean(2).name, 'randvals') # Now, make sure results are as expected with NaN present: arr[0, 0, 0] = np.nan dat = AttrArray(arr, name='randvals') self.assertEquals(dat[~np.isnan(dat)].mean(), dat.nanmean()) for i in range(len(arr.shape)): tmp1 = dat.mean(i) tmp1[0, 0] = 0 tmp2 = dat.nanmean(i) tmp2[0, 0] = 0 assert_array_almost_equal(tmp1, tmp2) self.assertEquals(tmp2.name, 'randvals') arr[3, 6, 2] = np.nan dat = AttrArray(arr, name='randvals') self.assertEquals(dat[~np.isnan(dat)].mean(), dat.nanmean()) tmp1 = dat.mean(0) tmp1[0, 0] = 0 tmp1[6, 2] = 0 tmp2 = dat.nanmean(0) tmp2[0, 0] = 0 tmp2[6, 2] = 0 assert_array_almost_equal(tmp1, tmp2) self.assertEquals(tmp2.name, 'randvals') tmp1 = dat.mean(1) tmp1[0, 0] = 0 tmp1[3, 2] = 0 tmp2 = dat.nanmean(1) tmp2[0, 0] = 0 tmp2[3, 2] = 0 assert_array_almost_equal(tmp1, tmp2) self.assertEquals(tmp2.name, 'randvals') tmp1 = dat.mean(2) tmp1[0, 0] = 0 tmp1[3, 6] = 0 tmp2 = dat.nanmean(2) tmp2[0, 0] = 0 tmp2[3, 6] = 0 assert_array_almost_equal(tmp1, tmp2) self.assertEquals(tmp2.name, 'randvals')
def test_new(self): # test new instantiation (attributes are defined by kwargs) # instatiation with a numpy ndarray: shape = (10, ) arr = np.random.random_sample(shape) dat_array = AttrArray(arr, name='randvals') self.assertTrue(dat_array.name == 'randvals') self.assertEquals(shape, dat_array.shape) self.assertTrue((dat_array == arr).all()) # another instatioation with an ndarray, but this time with # dtype set: shape = (1, 2, 3, 4) arr = np.random.random_sample(shape) dat_array = AttrArray(arr, name='randvals', dtype=np.float32) self.assertTrue(dat_array.name == 'randvals') self.assertEquals(shape, dat_array.shape) # "almost" equal because of the casting to np.float32: assert_array_almost_equal(dat_array, arr) self.assertTrue(dat_array.dtype == np.float32) # # another ndarray, with copy = True vs. copy = False shape = (10, 9, 8, 7, 6, 1, 8) arr = np.random.random_sample(shape) dat_array = AttrArray(arr, name='randvals', test1=33, test2='test', copy=True) self.assertTrue(dat_array.name == 'randvals') self.assertTrue(dat_array.test1 == 33) self.assertTrue(dat_array.test2 == 'test') self.assertEquals(shape, dat_array.shape) assert_array_equal(dat_array, arr) dat_array[0] += 5 # # "almost" equal because of slight inaccuracies in the the # # representation of floats: assert_array_almost_equal((dat_array[0] - 5), arr[0]) dat_array = AttrArray(arr, name='randvals', test1=33, test2='test', copy=False) self.assertTrue(dat_array.name == 'randvals') self.assertTrue(dat_array.test1 == 33) self.assertTrue(dat_array.test2 == 'test') self.assertEquals(shape, dat_array.shape) self.assertTrue((dat_array == arr).all()) dat_array[0] += 5 assert_array_equal(dat_array[0], arr[0]) # instantiation with a list: lst = range(10) dat_list = AttrArray(lst, name='range') self.assertTrue(dat_list.name == 'range') self.assertTrue((lst == dat_list).all()) lst = [['a', 'b', 'c']] dat_list = AttrArray(lst, name='list') self.assertTrue(dat_list.name == 'list') self.assertTrue((lst == dat_list).all()) lst = [[1, 2, 3], [4.5, 6, 7]] dat_list = AttrArray(lst, name='list') self.assertTrue(dat_list.name == 'list') self.assertTrue((lst == dat_list).all()) # instantiation with a AttrArray: dat_attrarray = AttrArray(dat_array, name='attrarray') self.assertTrue(dat_attrarray.name == 'attrarray') dat_attrarray = AttrArray(dat_list, newname='attrarray', test=44) self.assertTrue(dat_attrarray.newname == 'attrarray') self.assertTrue(dat_attrarray.test == 44)
def test_method(self): # make sure ndarray methods work and return a new AttrArray # instance with the attributes intact dat = AttrArray(np.random.rand(10), name='randvals') sdat = np.sqrt(dat) self.assertEquals(sdat.name, 'randvals')
def test_getattr(self): dat = AttrArray(np.random.rand(10), name='randvals') self.assertEquals(dat.name, 'randvals')
def test_new(self): # should raise Error if dims contains non-Dim instances: self.assertRaises(AttributeError,DimArray,np.random.rand(5,10), dims = np.arange(4)) self.assertRaises(AttributeError,DimArray,np.random.rand(5,10), dims=[Dim(range(5),name='freqs',unit='Hz'), AttrArray(range(10),name='time',unit='sec')]) self.assertRaises(AttributeError,DimArray,np.random.rand(5,10), dims=[AttrArray(range(5),name='freqs',unit='Hz'), Dim(range(10),name='time',unit='sec')]) # should throw Error if dims do not match data shape: self.assertRaises(AttributeError,DimArray,np.random.rand(5,10), dims=[Dim(range(10),name='freqs',unit='Hz'), Dim(range(5),name='time',unit='sec')]) self.assertRaises(AttributeError,DimArray,np.random.rand(5,10), dims=[Dim(range(5),name='freqs',unit='Hz')]) # should throw Error if 2 dims have the same name: self.assertRaises(AttributeError,DimArray,np.random.rand(10,5), dims=[Dim(range(10),name='dim1',unit='Hz'), Dim(range(5),name='dim1',unit='sec')]) self.assertRaises(AttributeError,DimArray,np.random.rand(10,3,5), dims=[Dim(range(10),name='dim1',unit='Hz'), Dim(range(3),name='dim2',unit='Hz'), Dim(range(5),name='dim1',unit='sec')]) self.assertRaises(AttributeError,DimArray,np.random.rand(10,3,5), dims=[Dim(range(10),name='dim1',unit='Hz'), Dim(range(3),name='dim1',unit='Hz'), Dim(range(5),name='dim1',unit='sec')]) # should throw Error if a dim name is not a valid identifier: self.assertRaises(AttributeError,DimArray,np.random.rand(10,5), dims=[Dim(range(10),name='dim1',unit='Hz'), Dim(range(5),name='dim 2',unit='sec')]) self.assertRaises(AttributeError,DimArray,np.random.rand(10,5), dims=[Dim(range(10),name='dim 1',unit='Hz'), Dim(range(5),name='dim2',unit='sec')]) self.assertRaises(AttributeError,DimArray,np.random.rand(10,5), dims=[Dim(range(10),name='dim 1',unit='Hz'), Dim(range(5),name='dim 2',unit='sec')]) self.assertRaises(AttributeError,DimArray,np.random.rand(10,5), dims=[Dim(range(10),name='dim1',unit='Hz'), Dim(range(5),name='dim$2',unit='sec')]) self.assertRaises(AttributeError,DimArray,np.random.rand(10,5), dims=[Dim(range(10),name='$dim1',unit='Hz'), Dim(range(5),name='dim2',unit='sec')]) self.assertRaises(AttributeError,DimArray,np.random.rand(10,5), dims=[Dim(range(10),name='1dim1',unit='Hz'), Dim(range(5),name='dim:2',unit='sec')]) self.assertRaises(AttributeError,DimArray,np.random.rand(10,5), dims=[Dim(range(10),name='dim1',unit='Hz'), Dim(range(5),name='',unit='sec')]) self.assertRaises(AttributeError,DimArray,np.random.rand(10,5), dims=[Dim(range(10),name='',unit='Hz'), Dim(range(5),name='dim2',unit='sec')]) self.assertRaises(AttributeError,DimArray,np.random.rand(10,5), dims=[Dim(range(10),name='',unit='Hz'), Dim(range(5),name='',unit='sec')]) # this is a proper initialization: dat = DimArray(np.random.rand(5,10), dims=[Dim(range(5),name='freqs',unit='Hz'), Dim(range(10),name='time',unit='sec')]) # should raise Attribute Error if dims is removed: self.assertRaises(AttributeError,dat.__setattr__,'dims',None) # ensure dim_names attribute is set properly: self.assertEquals(dat.dim_names,['freqs','time']) # ensure proper shape self.assertEquals(dat.shape,(5,10)) # ensure dims have proper lengths: self.assertEquals(len(dat.dims[0]),5) self.assertEquals(len(dat.dims[1]),10) # ensure that dims attributes are copied properly: self.assertEquals(dat.dims[0].unit,'Hz') self.assertEquals(dat.dims[1].unit,'sec') # check that dims values are preserved: self.assertEquals(dat.dims[0][-1],4) self.assertEquals(dat.dims[1][-1],9) dat = DimArray(np.random.rand(2,4,5), dims=[Dim(range(2),name='dim1',unit='Hz'), Dim(range(4),name='dim2',bla='bla'), Dim(range(5),name='dim3',attr1='attr1', attr2='attr2')]) # ensure dim_names attribute is set properly: self.assertEquals(dat.dim_names,['dim1','dim2','dim3']) # ensure proper shape self.assertEquals(dat.shape,(2,4,5)) # ensure dims have proper lengths: self.assertEquals(len(dat.dims[0]),2) self.assertEquals(len(dat.dims[1]),4) self.assertEquals(len(dat.dims[2]),5) # ensure that dims attributes are copied properly: self.assertEquals(dat.dims[0].unit,'Hz') self.assertEquals(dat.dims[1].bla,'bla') self.assertEquals(dat.dims[2].attr1,'attr1') self.assertEquals(dat.dims[2].attr2,'attr2') # check that dims values are preserved: self.assertEquals(dat.dims[0][-1],1) self.assertEquals(dat.dims[1][-1],3) self.assertEquals(dat.dims[2][-1],4) # check filling in of default dims if left out dat = DimArray(np.random.rand(4,3)) self.assertEquals(dat.dim_names, ['dim1','dim2']) assert_array_equal(dat['dim1'],np.arange(dat.shape[0])) assert_array_equal(dat['dim2'],np.arange(dat.shape[1]))