Example #1
0
    def test_funcs(self):
        """Test the numpy functions"""
        # make ndarray an Dimaray with identical data
        arr = np.random.rand(5,12,3,1)
        dat = DimArray(arr,dims=[Dim(range(5),name='one'),
                                 Dim(range(12),name='two'),
                                 Dim(range(3),name='three'),
                                 Dim(range(1),name='four')],test='tst')
        
        # these are functions that take an axis argument:
        funcs = [np.mean,np.all,np.any,np.argmax,np.argmin,np.argsort,
                 np.cumprod,np.cumsum,np.max,np.mean,np.min,np.prod,
                 np.ptp,np.std,np.sum,np.var]
        
        # The axes for the ndarray:
        axes_arr = [None,0,1,2,3,0,1,2,3]
        # The axes for the DimArray (we want to test indexing them by
        # number and name):
        axes_dat = [None,0,1,2,3,'one','two','three','four']

        # loop through the functions and axes:
        for func in funcs:
            for a in range(len(axes_arr)):
                # apply the function to the ndarray and the DimArray
                arr_func = func(arr,axis=axes_arr[a])
                dat_func = func(dat,axis=axes_dat[a])
                # make sure they are the same:
                assert_array_equal(arr_func,dat_func)
                if not(axes_dat[a] is None):
                    # ensure we still have a DimArray
                    self.assertTrue(isinstance(dat_func,DimArray))
                    # ensure that the attributes are preserved
                    self.assertEquals(dat_func.test,'tst')
                    
        # same tests as above but this time calling the DimArray
        # methods directly (this test is necessary because it is in
        # principle possible for the numpy function to work and the
        # DimArray method not to work (or vice versa):
        for a in range(len(axes_arr)):
            assert_array_equal(arr.all(axes_arr[a]),
                               dat.all(axes_dat[a]))
            assert_array_equal(arr.any(axes_arr[a]),
                               dat.any(axes_dat[a]))
            assert_array_equal(arr.argmax(axes_arr[a]),
                               dat.argmax(axes_dat[a]))
            assert_array_equal(arr.argmin(axes_arr[a]),
                               dat.argmin(axes_dat[a]))
            assert_array_equal(arr.argsort(axes_arr[a]),
                               dat.argsort(axes_dat[a]))
            assert_array_equal(arr.cumprod(axes_arr[a]),
                               dat.cumprod(axes_dat[a]))
            assert_array_equal(arr.cumsum(axes_arr[a]),
                               dat.cumsum(axes_dat[a]))
            assert_array_equal(arr.max(axes_arr[a]),
                               dat.max(axes_dat[a]))
            assert_array_equal(arr.mean(axes_arr[a]),
                               dat.mean(axes_dat[a]))
            assert_array_equal(arr.min(axes_arr[a]),
                               dat.min(axes_dat[a]))
            assert_array_equal(arr.prod(axes_arr[a]),
                               dat.prod(axes_dat[a]))
            assert_array_equal(arr.ptp(axes_arr[a]),
                               dat.ptp(axes_dat[a]))
            assert_array_equal(arr.std(axes_arr[a]),
                               dat.std(axes_dat[a]))
            assert_array_equal(arr.sum(axes_arr[a]),
                               dat.sum(axes_dat[a]))
            assert_array_equal(arr.var(axes_arr[a]),
                               dat.var(axes_dat[a]))
            if not(axes_dat[a] is None):
                self.assertTrue(isinstance(dat.all(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.any(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.argmax(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.argmin(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.argsort(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.cumprod(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.cumsum(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.max(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.mean(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.min(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.prod(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.ptp(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.std(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.sum(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.var(axes_arr[a]),DimArray))
                
                self.assertEquals(dat.all(axes_arr[a]).test,'tst')
                self.assertEquals(dat.any(axes_arr[a]).test,'tst')
                self.assertEquals(dat.argmax(axes_arr[a]).test,'tst')
                self.assertEquals(dat.argmin(axes_arr[a]).test,'tst')
                self.assertEquals(dat.argsort(axes_arr[a]).test,'tst')
                self.assertEquals(dat.cumprod(axes_arr[a]).test,'tst')
                self.assertEquals(dat.cumsum(axes_arr[a]).test,'tst')
                self.assertEquals(dat.max(axes_arr[a]).test,'tst')
                self.assertEquals(dat.mean(axes_arr[a]).test,'tst')
                self.assertEquals(dat.min(axes_arr[a]).test,'tst')
                self.assertEquals(dat.prod(axes_arr[a]).test,'tst')
                self.assertEquals(dat.ptp(axes_arr[a]).test,'tst')
                self.assertEquals(dat.std(axes_arr[a]).test,'tst')
                self.assertEquals(dat.sum(axes_arr[a]).test,'tst')
                self.assertEquals(dat.var(axes_arr[a]).test,'tst')
                
        # test functions that require function specific input:
        for a in range(len(axes_arr)):
            if axes_arr[a] is None:
                length = len(arr)
            else:
                length = np.shape(arr)[axes_arr[a]]
            cond = np.random.random(length)>0.5
            # calling the compress method directly:
            arr_func = arr.compress(cond,axis=axes_arr[a])
            dat_func = dat.compress(cond,axis=axes_dat[a])
            assert_array_equal(arr_func,dat_func)
            if axes_dat[a] is not None:
                self.assertTrue(isinstance(dat_func,DimArray))
                self.assertEquals(dat_func.test,'tst')
            # calling the numpy compress function:
            arr_func = np.compress(cond,arr,axis=axes_arr[a])
            dat_func = np.compress(cond,dat,axis=axes_dat[a])
            assert_array_equal(arr_func,dat_func)
            if axes_dat[a] is not None:
                self.assertTrue(isinstance(dat_func,DimArray))
                self.assertEquals(dat_func.test,'tst')            

            # the below tests should not run with axis==None:
            if axes_arr[a] is None:
                continue
            
            reps = np.random.random_integers(low=1, high=10, size=length)
            # calling the repeat method directly:
            arr_func = arr.repeat(reps,axis=axes_arr[a])
            dat_func = dat.repeat(reps,axis=axes_dat[a])
            assert_array_equal(arr_func,dat_func)
            if axes_dat[a] is not None:
                self.assertTrue(isinstance(dat_func,AttrArray))
                self.assertEquals(dat_func.test,'tst')
            # calling the numpy repeat function:
            arr_func = np.repeat(arr,reps,axis=axes_arr[a])
            dat_func = np.repeat(dat,reps,axis=axes_dat[a])
            assert_array_equal(arr_func,dat_func)
            if axes_dat[a] is not None:
                self.assertTrue(isinstance(dat_func,AttrArray))
                self.assertEquals(dat_func.test,'tst')

            # skip the last dimension for this test for
            # convenience (the last dimension only has 1 level):
            if a >= 3:
                continue
            indcs = np.arange(len(arr.shape))
            # calling the take method directly (squeeze, to get rid of
            # the last dimension):
            arr_func = arr.squeeze().take(indcs,axis=axes_arr[a])
            dat_func = dat.squeeze().take(indcs,axis=axes_dat[a])
            assert_array_equal(arr_func,dat_func)
            if axes_dat[a]:
                self.assertTrue(isinstance(dat_func,AttrArray))
                self.assertEquals(dat_func.test,'tst')
            # calling the numpy take function directly (squeeze, to get rid of
            # the last dimension):
            arr_func = np.take(arr.squeeze(),indcs,axis=axes_arr[a])
            dat_func = np.take(dat.squeeze(),indcs,axis=axes_dat[a])
            assert_array_equal(arr_func,dat_func)
            if axes_dat[a]:
                self.assertTrue(isinstance(dat_func,AttrArray))
                self.assertEquals(dat_func.test,'tst')

        # This should work with numpy 1.2 but doesn't
        # with 1.1.1 or below (therfore commented out for now):
        # arr_func = arr.clip(0.4,0.6)
        # dat_func = dat.clip(0.4,0.6)
        # assert_array_equal(arr_func,dat_func)
        #self.assertTrue(isinstance(dat_func,DimArray))
        #self.assertEquals(dat_func.test,'tst')
        #arr_func = np.clip(arr,0.4,0.6)
        #dat_func = np.clip(dat,0.4,0.6)
        #assert_array_equal(arr_func,dat_func)
        #self.assertTrue(isinstance(dat_func,DimArray))
        #self.assertEquals(dat_func.test,'tst')

        # other functions that don't necessarily take return a
        # DimArray:
        funcs = [np.diagonal,np.nonzero,np.ravel,np.squeeze,
                 np.sort,np.trace,np.transpose]
        for func in funcs:
            arr_func = func(arr)
            dat_func = func(dat)
            assert_array_equal(arr_func,dat_func)

        # same tests as above, but calling the methods directly:
        assert_array_equal(arr.diagonal(),dat.diagonal())
        assert_array_equal(arr.nonzero(),dat.nonzero())
        assert_array_equal(arr.ravel(),dat.ravel())
        assert_array_equal(arr.squeeze(),dat.squeeze())
        assert_array_equal(arr.sort(),dat.sort())
        assert_array_equal(arr.trace(),dat.trace())
        assert_array_equal(arr.transpose(),dat.transpose())
        # there is no numpy.flatten() function, so we only call the
        # method directly:
        assert_array_equal(arr.flatten(),dat.flatten())
        
        assert_array_equal(arr.swapaxes(0,1),dat.swapaxes(0,1))
        self.assertTrue(isinstance(dat.swapaxes(0,1),DimArray))
        self.assertEquals(dat.swapaxes(0,1).test,'tst')
        assert_array_equal(arr.swapaxes(0,1),dat.swapaxes('one','two'))
        self.assertTrue(isinstance(dat.swapaxes('one','two'),DimArray))
        self.assertEquals(dat.swapaxes('one','two').test,'tst')
        assert_array_equal(arr.swapaxes(1,3),dat.swapaxes(1,3))
        self.assertTrue(isinstance(dat.swapaxes(1,3),DimArray))
        self.assertEquals(dat.swapaxes(1,3).test,'tst')
        assert_array_equal(arr.swapaxes(1,3),dat.swapaxes('two','four'))
        self.assertTrue(isinstance(dat.swapaxes('two','four'),DimArray))
        self.assertEquals(dat.swapaxes('two','four').test,'tst')
Example #2
0
    def test_funcs(self):
        """Test the numpy functions"""
        # make ndarray an Dimaray with identical data
        arr = np.random.rand(5,12,3,1)
        dat = DimArray(arr,dims=[Dim(range(5),name='one'),
                                 Dim(range(12),name='two'),
                                 Dim(range(3),name='three'),
                                 Dim(range(1),name='four')],test='tst')
        
        # these are functions that take an axis argument:
        funcs = [np.mean,np.all,np.any,np.argmax,np.argmin,np.argsort,
                 np.cumprod,np.cumsum,np.max,np.mean,np.min,np.prod,
                 np.ptp,np.std,np.sum,np.var]
        
        # The axes for the ndarray:
        axes_arr = [None,0,1,2,3,0,1,2,3]
        # The axes for the DimArray (we want to test indexing them by
        # number and name):
        axes_dat = [None,0,1,2,3,'one','two','three','four']

        # loop through the functions and axes:
        for func in funcs:
            for a in range(len(axes_arr)):
                # apply the function to the ndarray and the DimArray
                arr_func = func(arr,axis=axes_arr[a])
                dat_func = func(dat,axis=axes_dat[a])
                # make sure they are the same:
                assert_array_equal(arr_func,dat_func)
                if not(axes_dat[a] is None):
                    # ensure we still have a DimArray
                    self.assertTrue(isinstance(dat_func,DimArray))
                    # ensure that the attributes are preserved
                    self.assertEquals(dat_func.test,'tst')
                    
        # same tests as above but this time calling the DimArray
        # methods directly (this test is necessary because it is in
        # principle possible for the numpy function to work and the
        # DimArray method not to work (or vice versa):
        for a in range(len(axes_arr)):
            assert_array_equal(arr.all(axes_arr[a]),
                               dat.all(axes_dat[a]))
            assert_array_equal(arr.any(axes_arr[a]),
                               dat.any(axes_dat[a]))
            assert_array_equal(arr.argmax(axes_arr[a]),
                               dat.argmax(axes_dat[a]))
            assert_array_equal(arr.argmin(axes_arr[a]),
                               dat.argmin(axes_dat[a]))
            assert_array_equal(arr.argsort(axes_arr[a]),
                               dat.argsort(axes_dat[a]))
            assert_array_equal(arr.cumprod(axes_arr[a]),
                               dat.cumprod(axes_dat[a]))
            assert_array_equal(arr.cumsum(axes_arr[a]),
                               dat.cumsum(axes_dat[a]))
            assert_array_equal(arr.max(axes_arr[a]),
                               dat.max(axes_dat[a]))
            assert_array_equal(arr.mean(axes_arr[a]),
                               dat.mean(axes_dat[a]))
            assert_array_equal(arr.min(axes_arr[a]),
                               dat.min(axes_dat[a]))
            assert_array_equal(arr.prod(axes_arr[a]),
                               dat.prod(axes_dat[a]))
            assert_array_equal(arr.ptp(axes_arr[a]),
                               dat.ptp(axes_dat[a]))
            assert_array_equal(arr.std(axes_arr[a]),
                               dat.std(axes_dat[a]))
            assert_array_equal(arr.sum(axes_arr[a]),
                               dat.sum(axes_dat[a]))
            assert_array_equal(arr.var(axes_arr[a]),
                               dat.var(axes_dat[a]))
            if not(axes_dat[a] is None):
                self.assertTrue(isinstance(dat.all(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.any(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.argmax(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.argmin(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.argsort(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.cumprod(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.cumsum(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.max(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.mean(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.min(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.prod(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.ptp(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.std(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.sum(axes_arr[a]),DimArray))
                self.assertTrue(isinstance(dat.var(axes_arr[a]),DimArray))
                
                self.assertEquals(dat.all(axes_arr[a]).test,'tst')
                self.assertEquals(dat.any(axes_arr[a]).test,'tst')
                self.assertEquals(dat.argmax(axes_arr[a]).test,'tst')
                self.assertEquals(dat.argmin(axes_arr[a]).test,'tst')
                self.assertEquals(dat.argsort(axes_arr[a]).test,'tst')
                self.assertEquals(dat.cumprod(axes_arr[a]).test,'tst')
                self.assertEquals(dat.cumsum(axes_arr[a]).test,'tst')
                self.assertEquals(dat.max(axes_arr[a]).test,'tst')
                self.assertEquals(dat.mean(axes_arr[a]).test,'tst')
                self.assertEquals(dat.min(axes_arr[a]).test,'tst')
                self.assertEquals(dat.prod(axes_arr[a]).test,'tst')
                self.assertEquals(dat.ptp(axes_arr[a]).test,'tst')
                self.assertEquals(dat.std(axes_arr[a]).test,'tst')
                self.assertEquals(dat.sum(axes_arr[a]).test,'tst')
                self.assertEquals(dat.var(axes_arr[a]).test,'tst')
                
        # test functions that require function specific input:
        for a in range(len(axes_arr)):
            if axes_arr[a] is None:
                length = len(arr)
            else:
                length = np.shape(arr)[axes_arr[a]]
            cond = np.random.random(length)>0.5
            # calling the compress method directly:
            arr_func = arr.compress(cond,axis=axes_arr[a])
            dat_func = dat.compress(cond,axis=axes_dat[a])
            assert_array_equal(arr_func,dat_func)
            if axes_dat[a] is not None:
                self.assertTrue(isinstance(dat_func,DimArray))
                self.assertEquals(dat_func.test,'tst')
            # calling the numpy compress function:
            arr_func = np.compress(cond,arr,axis=axes_arr[a])
            dat_func = np.compress(cond,dat,axis=axes_dat[a])
            assert_array_equal(arr_func,dat_func)
            if axes_dat[a] is not None:
                self.assertTrue(isinstance(dat_func,DimArray))
                self.assertEquals(dat_func.test,'tst')            

            # the below tests should not run with axis==None:
            if axes_arr[a] is None:
                continue
            
            reps = np.random.random_integers(low=1, high=10, size=length)
            # calling the repeat method directly:
            arr_func = arr.repeat(reps,axis=axes_arr[a])
            dat_func = dat.repeat(reps,axis=axes_dat[a])
            assert_array_equal(arr_func,dat_func)
            if axes_dat[a] is not None:
                self.assertTrue(isinstance(dat_func,AttrArray))
                self.assertEquals(dat_func.test,'tst')
            # calling the numpy repeat function:
            arr_func = np.repeat(arr,reps,axis=axes_arr[a])
            dat_func = np.repeat(dat,reps,axis=axes_dat[a])
            assert_array_equal(arr_func,dat_func)
            if axes_dat[a] is not None:
                self.assertTrue(isinstance(dat_func,AttrArray))
                self.assertEquals(dat_func.test,'tst')

            # skip the last dimension for this test for
            # convenience (the last dimension only has 1 level):
            if a >= 3:
                continue
            indcs = np.arange(len(arr.shape))
            # calling the take method directly (squeeze, to get rid of
            # the last dimension):
            arr_func = arr.squeeze().take(indcs,axis=axes_arr[a])
            dat_func = dat.squeeze().take(indcs,axis=axes_dat[a])
            assert_array_equal(arr_func,dat_func)
            if axes_dat[a]:
                self.assertTrue(isinstance(dat_func,AttrArray))
                self.assertEquals(dat_func.test,'tst')
            # calling the numpy take function directly (squeeze, to get rid of
            # the last dimension):
            arr_func = np.take(arr.squeeze(),indcs,axis=axes_arr[a])
            dat_func = np.take(dat.squeeze(),indcs,axis=axes_dat[a])
            assert_array_equal(arr_func,dat_func)
            if axes_dat[a]:
                self.assertTrue(isinstance(dat_func,AttrArray))
                self.assertEquals(dat_func.test,'tst')

        # This should work with numpy 1.2 but doesn't
        # with 1.1.1 or below (therfore commented out for now):
        # arr_func = arr.clip(0.4,0.6)
        # dat_func = dat.clip(0.4,0.6)
        # assert_array_equal(arr_func,dat_func)
        #self.assertTrue(isinstance(dat_func,DimArray))
        #self.assertEquals(dat_func.test,'tst')
        #arr_func = np.clip(arr,0.4,0.6)
        #dat_func = np.clip(dat,0.4,0.6)
        #assert_array_equal(arr_func,dat_func)
        #self.assertTrue(isinstance(dat_func,DimArray))
        #self.assertEquals(dat_func.test,'tst')

        # other functions that don't necessarily take return a
        # DimArray:
        funcs = [np.diagonal,np.nonzero,np.ravel,np.squeeze,
                 np.sort,np.trace,np.transpose]
        for func in funcs:
            arr_func = func(arr)
            dat_func = func(dat)
            assert_array_equal(arr_func,dat_func)

        # same tests as above, but calling the methods directly:
        assert_array_equal(arr.diagonal(),dat.diagonal())
        assert_array_equal(arr.nonzero(),dat.nonzero())
        assert_array_equal(arr.ravel(),dat.ravel())
        assert_array_equal(arr.squeeze(),dat.squeeze())
        assert_array_equal(arr.sort(),dat.sort())
        assert_array_equal(arr.trace(),dat.trace())
        assert_array_equal(arr.transpose(),dat.transpose())
        # there is no numpy.flatten() function, so we only call the
        # method directly:
        assert_array_equal(arr.flatten(),dat.flatten())
        
        assert_array_equal(arr.swapaxes(0,1),dat.swapaxes(0,1))
        self.assertTrue(isinstance(dat.swapaxes(0,1),DimArray))
        self.assertEquals(dat.swapaxes(0,1).test,'tst')
        assert_array_equal(arr.swapaxes(0,1),dat.swapaxes('one','two'))
        self.assertTrue(isinstance(dat.swapaxes('one','two'),DimArray))
        self.assertEquals(dat.swapaxes('one','two').test,'tst')
        assert_array_equal(arr.swapaxes(1,3),dat.swapaxes(1,3))
        self.assertTrue(isinstance(dat.swapaxes(1,3),DimArray))
        self.assertEquals(dat.swapaxes(1,3).test,'tst')
        assert_array_equal(arr.swapaxes(1,3),dat.swapaxes('two','four'))
        self.assertTrue(isinstance(dat.swapaxes('two','four'),DimArray))
        self.assertEquals(dat.swapaxes('two','four').test,'tst')