Example #1
0
class Stack(array):
    # Stack

    def __init__(self, size=0, value=0):
        self.body = Array(size, value)

    def __str__(self):
        return self.body.__str__()

    def empty(self):
        return self.body.empty()

    def size(self):
        return self.body.size()

    def top(self):
        return self.body.back()

    def push(self, object):
        self.body.push_back(object)

    def pop(self):
        return self.body.pop_back()

    def swap(self, other_stack):
        self.body, other_stack.body = other_stack.body, self.body
Example #2
0
 def test_2D_printstatement(self):
     my_array = Array((3, 2), 8, 3, 4, 1, 6, 1)
     answer = [[8, 3], [4, 1], [6, 1]]
     assert my_array.__str__() == str(answer)
Example #3
0
class SimpleData:
    def __init__(self,
                 storage,
                 shape=None,
                 dtype=None,
                 units=None,
                 title=None,
                 skip_flaws=False,
                 signal=None):
        '''
        Constructor
        '''
        if title is None:
            if hasattr(storage, 'title'):
                title = storage.title
        if type(storage) is int or type(storage) is float or type(
                storage) is long or type(storage) is bool:
            storage = [storage]
        if isinstance(storage, Array):
            self.storage = storage
            #            self.name = name
            if signal:
                self.__iDataItem__ = nx_factory.\
                            createNXsignal(None, 'none', storage.__iArray__)
            else:
                self.__iDataItem__ = nx_factory.\
                            createNXDataItem(None, 'none', storage.__iArray__)
            name = 'sd' + str(id(self.__iDataItem__))
            self.__iDataItem__.setShortName(name)
            if not units is None:
                self.__iDataItem__.setUnits(str(units))
        elif isinstance(storage, SimpleData):
            name = storage.name
            self.storage = storage.storage
            if signal:
                self.__iDataItem__ = nx_factory.\
                            createNXsignal(None, 'none', storage.__iArray__)
            else:
                self.__iDataItem__ = nx_factory.\
                            createNXDataItem(None, name, storage.__iArray__)
            if not units is None:
                self.__iDataItem__.setUnits(str(units))
        elif hasattr(storage, '__len__'):
            self.storage = Array(storage, shape, dtype)
            if signal:
                self.__iDataItem__ = nx_factory.\
                            createNXsignal(None, 'none', storage.__iArray__)
            else:
                self.__iDataItem__ = nx_factory.\
                            createNXDataItem(None, 'none', self.storage.__iArray__)
            name = 'sd' + str(id(self.__iDataItem__))
            self.__iDataItem__.setShortName(name)
            if not units is None:
                self.__iDataItem__.setUnits(str(units))
        else:
            self.__iDataItem__ = storage
            self.storage = Array(storage.getData(skip_flaws))
            if not units is None:
                ounits = self.__iDataItem__.getUnits()
                if ounits is None or len(ounits) == 0:
                    self.__iDataItem__.setUnits(str(units))
        if title is None:
            title = self.__iDataItem__.getTitle()
        if title is None:
            title = self.__iDataItem__.getShortName()
        self.__iDataItem__.setTitle(str(title))
        self.skip_flaws = skip_flaws
#            self.name = iDataItem.getShortName()

#    def __add__(self, obj) :
#        arr1 = self.storage
#        arr2 = obj.storage
#        narr = arr1 + arr2
#        di = NcDataItem(self.__iDataItem__)
#        di.setCachedData(narr.__iArray__, 0)
#        nsd = SimpleData(di)
#        nsd.storage = narr
#        return nsd

#    def __mul__(self, object):
#        array1 = self.__iDataItem__.getData()
#        array2 = object.__iDataItem__.getData()
#        return SimpleData(array1.getArrayMath().toEltMultiply(array2).getArray())

#    def __repr__(self):
#        return self.__class__.__name__

    def __set_name__(self, name):
        self.__iDataItem__.setShortName(str(name))

    #####################################################################################
    #   Array indexing
    #####################################################################################
    def __getitem__(self, index):
        nst = self.storage[index]
        if isinstance(nst, Array):
            return self.__new__(nst)
        else:
            return nst

    def get_slice(self, dim, index):
        return self.__new__(self.storage.get_slice(dim, index))

    def get_section(self, origin, shape, stride=None):
        return self.__new__(self.storage.get_section(origin, shape, stride))

    def get_reduced(self, dim=None):
        return self.__new__(self.storage.get_reduced(dim))

    def section_iter(self, shape):
        return SimpledataSectionIter(self, shape)
        self.storage.section_iter(shape)

    def take(self, indices, axis=None, out=None, mode='raise'):
        return self.__new__(self.storage.take(indices, axis, out, mode))
#####################################################################################
# Array accessing
#####################################################################################

    def get_value(self, index):
        return self.storage.get_value(index)

    def __len__(self):
        return len(self.storage)

    def __getattr__(self, name):
        if name == 'name':
            return self.__iDataItem__.getShortName()
        elif name == 'units':
            return self.__iDataItem__.getUnits()
        elif name == 'title':
            title = self.__iDataItem__.getTitle()
            if title is None:
                return self.name
            else:
                return title
        else:
            att = self.__iDataItem__.findAttributeIgnoreCase(name)
            if att:
                val = att.getValue()
                if val.getElementType() is String:
                    return str(val)
                else:
                    arr = Array(val)
                    if arr.size == 1:
                        return arr[0]
        return getattr(self.storage, name)

    def get_attribute(self, name):
        att = self.__iDataItem__.findAttributeIgnoreCase(name)
        if att:
            val = att.getValue()
            if val.getElementType() is String:
                return str(val)
            else:
                arr = Array(val)
                if arr.size == 1:
                    return arr[0]
        return None

    def __setattr__(self, name, value):
        if name == 'name':
            #            self.__iDataItem__.setShortName(str(value))
            raise AttributeError, 'name can not be set, try set the title instead'
        elif name == 'units':
            self.__iDataItem__.setUnits(str(value))
        elif name == 'title':
            self.__iDataItem__.setTitle(str(value))
        elif name == 'storage':
            self.__dict__[name] = value
        elif name.startswith('__'):
            self.__dict__[name] = value
        else:
            self.__dict__[name] = value

    def set_attribute(self, name, value):
        if type(value) is str:
            self.__iDataItem__.addStringAttribute(name, value)
        else:
            arr = Array(value)
            att = nx_factory.createAttribute(name, arr.__iArray__)
            self.__iDataItem__.addOneAttribute(att)

    def __iter__(self):
        if (self.ndim > 1):
            return SimpledataSliceIter(self)
        else:
            return self.item_iter()

    def item_iter(self):
        return self.storage.item_iter()

    def set_value(self, index, value):
        self.storage.set_value(index, value)

#********************************************************************************
#     Array math
#********************************************************************************

    def __eq__(self, obj):
        if obj is None:
            return False
        if isinstance(obj, SimpleData):
            obj = obj.storage
        res = self.storage.__eq__(obj)
        if isinstance(res, Array):
            return self.__new__(res)
        else:
            return res

    def __ne__(self, obj):
        if obj is None:
            return True
        if isinstance(obj, SimpleData):
            obj = obj.storage
        res = self.storage.__ne__(obj)
        if isinstance(res, Array):
            return self.__new__(res)
        else:
            return res

    def __lt__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        res = self.storage.__lt__(obj)
        return self.__new__(res)

    def __gt__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        res = self.storage.__gt__(obj)
        return self.__new__(res)

    def __le__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        res = self.storage.__le__(obj)
        return self.__new__(res)

    def __ge__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        res = self.storage.__ge__(obj)
        return self.__new__(res)

    def __not__(self):
        raise ValueError, 'The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()'

    def __add__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        return self.__new__(self.storage + obj)

    def __iadd__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        self.storage.__iadd__(obj)
        return self

    def __radd__(self, obj):
        return self.__add__(obj)

    def __div__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        return self.__new__(self.storage / obj)

    def __rdiv__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        return self.__new__(self.storage.__rdiv__(obj))

    def __mul__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        return self.__new__(self.storage * obj)

    def __rmul__(self, obj):
        return self.__mul__(obj)

    def __neg__(self):
        return self * -1

    def __sub__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        return self.__new__(self.storage - obj)

    def __rsub__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        return self.__new__(self.storage.__rsub__(obj))

    def __invert__(self):
        return self.__new__(self.storage.__invert__())

    def __pow__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        return self.__new__(self.storage.__pow__(obj))

    def exp(self):
        return self.__new__(self.storage.exp())

    def log10(self):
        return self.__new__(self.storage.log10())

    def ln(self):
        return self.__new__(self.storage.ln())

    def sqrt(self):
        return self.__new__(self.storage.sqrt())

    def __rpow__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        return self.__new__(self.storage.__rpow__(obj))

    def __mod__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        return self.__new__(self.storage % obj)

    def __rmod__(self, obj):
        if isinstance(obj, SimpleData):
            obj = obj.storage
        return self.__new__(self.storage.__rmod__(obj))

    def __sin__(self):
        return self.__new__(self.storage.__sin__())

    def __cos__(self):
        return self.__new__(self.storage.__cos__())

    def __tan__(self):
        return self.__new__(self.storage.__tan__())

    def __arcsin__(self):
        return self.__new__(self.storage.__arcsin__())

    def __arccos__(self):
        return self.__new__(self.storage.__arccos__())

    def __arctan__(self):
        return self.__new__(self.storage.__arctan__())

    def __exp__(self):
        return self.__new__(self.storage.__exp__())

    def __prod__(self, axis=None):
        return self.__new__(self.storage.__prod__(axis))

    def max(self, axis=None, out=None):
        if axis is None:
            return self.storage.max()
        else:
            if out is None:
                return self.__new__(self.storage.max(axis))
            else:
                if isinstance(out, SimpleData):
                    obj = out.storage
                else:
                    obj = out
                self.storage.max(axis, obj)
                return out

    def min(self, axis=None, out=None):
        if axis is None:
            return self.storage.min()
        else:
            if out is None:
                return self.__new__(self.storage.min(axis))
            else:
                if isinstance(out, SimpleData):
                    obj = out.storage
                else:
                    obj = out
                self.storage.min(axis, obj)
                return out

    def argmax(self, axis=None):
        return self.storage.argmax(axis)

    def argmin(self, axis=None):
        return self.storage.argmin(axis)

    def sum(self, axis=None, dtype=None, out=None):
        if axis is None:
            return self.storage.sum(dtype=dtype)
        else:
            if out is None:
                return self.__new__(self.storage.sum(axis, dtype))
            else:
                return self.storage.sum(axis, dtype, out)

    def transpose(self, axes=None):
        return self.__new__(self.storage.transpose(axes))

    def compress(self, condition, axis=None, out=None):
        return self.__new__(self.storage.compress(condition, axis, out))

    def clip(self, a_min, a_max, out=None):
        if out is None:
            return self.__new__(self.storage.clip(a_min, a_max))
        else:
            if hasattr(out, 'storage'):
                self.storage.clip(a_min, a_max, out.storage)
            else:
                self.storage.clip(a_min, a_max, out)
            return out

    def mean(self, axis=None, dtype=None, out=None):
        if axis is None:
            return self.storage.mean(dtype=dtype)
        else:
            if out is None:
                return self.__new__(self.storage.mean(axis, dtype))
            else:
                return self.storage.mean(axis, dtype, out)
#********************************************************************************
#     Array utilities
#********************************************************************************

    def __repr__(self, indent='', skip=True):
        indent += '           '
        res = 'SimpleData(' + self.storage.__repr__(indent, skip) + ', \n' \
                + indent + 'title=\'' + self.title + '\''
        if not self.units is None:
            res += ',\n' + indent + 'units=\'' + self.units + '\''
        res += ')'
        return res

    def __str__(self, indent='', skip=True):
        if self.dtype is str:
            return indent + self.storage.__str__(indent, skip)
        res = 'title: ' + self.title + '\n' + indent
        if not self.units is None and len(self.units) > 0:
            res += 'units: ' + self.units + '\n' + indent
        res += 'storage: ' + self.storage.__str__(indent + ' ' * 9)
        return res

    def tolist(self):
        return self.storage.tolist()

#####################################################################################
#   Array modification
#####################################################################################

    def __setitem__(self, index, value):
        if isinstance(value, SimpleData):
            value = value.storage
        self.storage[index] = value

    def copy_from(self, value, length=-1):
        if isinstance(value, SimpleData):
            value = value.storage
        self.storage.copy_from(value, length)

    def fill(self, val):
        self.storage.fill(val)

    def put(self, indices, values, mode='raise'):
        self.storage.put(indices, values, mode)

#####################################################################################
#   Reinterpreting arrays
#####################################################################################

    def reshape(self, shape):
        return self.__new__(self.storage.reshape(shape))

    def flatten(self):
        return self.__new__(self.storage.flatten())

    def view_1d(self):
        return self.__new__(self.storage.view_1d())

    def __copy__(self):
        return self.__new__(self.storage.__copy__())

    def __deepcopy__(self):
        return self.__new__(self.storage.__deepcopy__())

    def float_copy(self):
        return self.__new__(self.storage.float_copy())

    def positive_float_copy(self):
        return self.__new__(self.storage.positive_float_copy())

    def __new__(self, storage, units=None, parent=None, title=None):
        name = self.name
        if units is None:
            units = self.units
        if title is None:
            title = self.title
        sd = new(storage, name, units, parent, title)
        for att in self.__iDataItem__.getAttributeList():
            sd.__iDataItem__.addOneAttribute(att)
        return sd

    def __dir__(self):
        dirs = self.storage.__dir__()
        dirs.append('name')
        dirs.append('storage')
        dirs.append('title')
        dirs.append('units')
        return sorted(dirs)

    def all(self):
        return self.storage.all()

    def any(self):
        return self.storage.any()

    def get_flawed_indices(self):
        return self.__iDataItem__.getFlawedIndexList()

    def delete_slice(self, indices):
        slices = []
        if type(indices) is int:
            slices = [indices]
        elif hasattr(indices, '__len__'):
            slices = indices
        else:
            raise AttributeError, 'indices must be either integer value or integer list'
        if len(slices) > 0:
            narr = array.delete(self.storage, slices, 0)
            oname = self.__iDataItem__.getShortName()
            self.__iDataItem__ = nx_factory.\
                            createNXsignal(None, oname, narr.__iArray__)
            self.storage = narr

    def intg(self, axis=None, out=None, keepdims=False):
        if axis is None:
            return self.storage.intg()
        else:
            if out is None:
                return self.__new__(self.storage.intg(axis, out, keepdims))
            else:
                return self.storage.intg(axis, out, keepdims)
Example #4
0
 def test_1D_printstatement(self):
     vec1 = Array((4, ), 2, 3, 1, 0)
     answer = [2, 3, 1, 0]
     assert vec1.__str__() == str(answer)
Example #5
0
class SimpleData:
 
    def __init__(self, storage, shape = None, dtype = None, units = None, title = None, skip_flaws = False, signal = None):
        '''
        Constructor
        '''
        if title is None :
            if hasattr(storage, 'title') :
                title = storage.title
        if type(storage) is int or type(storage) is float or type(storage) is long or type(storage) is bool :
            storage = [storage]
        if isinstance(storage, Array) :
            self.storage = storage
#            self.name = name
            if signal :
                self.__iDataItem__ = nx_factory.\
                            createNXsignal(None, 'none', storage.__iArray__)
            else :
                self.__iDataItem__ = nx_factory.\
                            createNXDataItem(None, 'none', storage.__iArray__)
            name = 'sd' + str(id(self.__iDataItem__))
            self.__iDataItem__.setShortName(name)
            if not units is None :
                self.__iDataItem__.setUnits(str(units))
        elif isinstance(storage, SimpleData) :
            name = storage.name
            self.storage = storage.storage
            if signal :
                self.__iDataItem__ = nx_factory.\
                            createNXsignal(None, 'none', storage.__iArray__)
            else :
                self.__iDataItem__ = nx_factory.\
                            createNXDataItem(None, name, storage.__iArray__)
            if not units is None :
                self.__iDataItem__.setUnits(str(units))
        elif hasattr(storage, '__len__') :
            self.storage = Array(storage, shape, dtype)
            if signal :
                self.__iDataItem__ = nx_factory.\
                            createNXsignal(None, 'none', storage.__iArray__)
            else :
                self.__iDataItem__ = nx_factory.\
                            createNXDataItem(None, 'none', self.storage.__iArray__)
            name = 'sd' + str(id(self.__iDataItem__))
            self.__iDataItem__.setShortName(name)
            if not units is None :
                self.__iDataItem__.setUnits(str(units))
        else :
            self.__iDataItem__ = storage
            self.storage = Array(storage.getData(skip_flaws))
            if not units is None :
                ounits = self.__iDataItem__.getUnits()
                if ounits is None or len(ounits) == 0 :
                    self.__iDataItem__.setUnits(str(units))
        if title is None :
            title = self.__iDataItem__.getTitle()
        if title is None :
            title = self.__iDataItem__.getShortName()
        self.__iDataItem__.setTitle(str(title))
        self.skip_flaws = skip_flaws
#            self.name = iDataItem.getShortName()


#    def __add__(self, obj) :
#        arr1 = self.storage
#        arr2 = obj.storage
#        narr = arr1 + arr2
#        di = NcDataItem(self.__iDataItem__)
#        di.setCachedData(narr.__iArray__, 0)
#        nsd = SimpleData(di)
#        nsd.storage = narr
#        return nsd
    
#    def __mul__(self, object):
#        array1 = self.__iDataItem__.getData()
#        array2 = object.__iDataItem__.getData()
#        return SimpleData(array1.getArrayMath().toEltMultiply(array2).getArray())
    
        
#    def __repr__(self):
#        return self.__class__.__name__
    def __set_name__(self, name):
        self.__iDataItem__.setShortName(str(name))
        
    #####################################################################################
    #   Array indexing
    #####################################################################################
    def __getitem__(self, index):
        nst = self.storage[index]
        if isinstance(nst, Array) :
            return self.__new__(nst)
        else :
            return nst
            
    def get_slice(self, dim, index):
        return self.__new__(self.storage.get_slice(dim, index))
        
    
    def get_section(self, origin, shape, stride = None): 
        return self.__new__(self.storage.get_section(origin, shape, stride))
    
    def get_reduced(self, dim = None):
        return self.__new__(self.storage.get_reduced(dim))
        
    def section_iter(self, shape):
        return SimpledataSectionIter(self, shape)
        self.storage.section_iter(shape)
    
    def take(self, indices, axis=None, out=None, mode='raise'):
        return self.__new__(self.storage.take(indices, axis, out, mode))
#####################################################################################
# Array accessing
#####################################################################################    
    def get_value(self, index) :
        return self.storage.get_value(index)
    
    def __len__(self):
        return len(self.storage)
    
    def __getattr__(self, name):
        if name == 'name' :
            return self.__iDataItem__.getShortName()
        elif name == 'units' :
            return self.__iDataItem__.getUnits()
        elif name == 'title' :
            title = self.__iDataItem__.getTitle()
            if title is None :
                return self.name
            else :
                return title
        else :
            att = self.__iDataItem__.findAttributeIgnoreCase(name)
            if att:
                val = att.getValue()
                if val.getElementType() is String:
                    return str(val)
                else:
                    arr = Array(val)
                    if arr.size == 1 :
                        return arr[0]
        return getattr(self.storage, name)
    
    def get_attribute(self, name):
        att = self.__iDataItem__.findAttributeIgnoreCase(name)
        if att:
            val = att.getValue()
            if val.getElementType() is String:
                return str(val)
            else:
                arr = Array(val)
                if arr.size == 1 :
                    return arr[0]
        return None

    def __setattr__(self, name, value):
        if name == 'name' :
#            self.__iDataItem__.setShortName(str(value))
            raise AttributeError, 'name can not be set, try set the title instead'
        elif name == 'units' :
            self.__iDataItem__.setUnits(str(value))
        elif name == 'title' :
            self.__iDataItem__.setTitle(str(value))
        elif name == 'storage' :
            self.__dict__[name] = value
        elif name.startswith('__'):
            self.__dict__[name] = value
        else:
            self.__dict__[name] = value
    
    def set_attribute(self, name, value):
        if type(value) is str:
            self.__iDataItem__.addStringAttribute(name, value)
        else:
            arr = Array(value)
            att = nx_factory.createAttribute(name, arr.__iArray__)
            self.__iDataItem__.addOneAttribute(att)
        
        
    def __iter__(self):
        if (self.ndim > 1) :
            return SimpledataSliceIter(self)
        else :
            return self.item_iter()
        
    def item_iter(self):
        return self.storage.item_iter()
    
    def set_value(self, index, value):
        self.storage.set_value(index, value)
        
#********************************************************************************
#     Array math
#********************************************************************************
    
    def __eq__(self, obj) :
        if obj is None:
            return False
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        res = self.storage.__eq__(obj)
        if isinstance(res, Array) :
            return self.__new__(res)
        else :
            return res
    
    def __ne__(self, obj):
        if obj is None:
            return True
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        res = self.storage.__ne__(obj)
        if isinstance(res, Array) :
            return self.__new__(res)
        else :
            return res

    def __lt__(self, obj) :
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        res = self.storage.__lt__(obj)
        return self.__new__(res)

    def __gt__(self, obj) :
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        res = self.storage.__gt__(obj)
        return self.__new__(res)

    def __le__(self, obj) :
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        res = self.storage.__le__(obj)
        return self.__new__(res)

    def __ge__(self, obj) :
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        res = self.storage.__ge__(obj)
        return self.__new__(res)
        
    def __not__(self):
        raise ValueError, 'The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()'

    def __add__(self, obj):
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        return self.__new__(self.storage + obj)

    def __iadd__(self, obj):
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        self.storage.__iadd__(obj)
        return self

    def __radd__(self, obj):
        return self.__add__(obj)
            
    def __div__(self, obj):
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        return self.__new__(self.storage / obj)
    
    def __rdiv__(self, obj):
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        return self.__new__(self.storage.__rdiv__(obj))
    
    def __mul__(self, obj):
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        return self.__new__(self.storage * obj)
    
    def __rmul__(self, obj):
        return self.__mul__(obj)
        
    def __neg__(self):
        return self * -1
    
    def __sub__(self, obj):
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        return self.__new__(self.storage - obj)
    
    def __rsub__(self, obj):
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        return self.__new__(self.storage.__rsub__(obj))
    
    def __invert__(self):
        return self.__new__(self.storage.__invert__())
    
    def __pow__(self, obj):
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        return self.__new__(self.storage.__pow__(obj))

    def exp(self):
        return self.__new__(self.storage.exp())

    def log10(self):
        return self.__new__(self.storage.log10())
    
    def ln(self):
        return self.__new__(self.storage.ln())

    def sqrt(self):
        return self.__new__(self.storage.sqrt())
        
    def __rpow__(self, obj):
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        return self.__new__(self.storage.__rpow__(obj))
    
    def __mod__(self, obj):
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        return self.__new__(self.storage % obj)

    def __rmod__(self, obj):
        if isinstance(obj, SimpleData) :
            obj = obj.storage
        return self.__new__(self.storage.__rmod__(obj))

    def __sin__(self):
        return self.__new__(self.storage.__sin__())
    
    def __cos__(self):
        return self.__new__(self.storage.__cos__())
    
    def __tan__(self):
        return self.__new__(self.storage.__tan__())
    
    def __arcsin__(self):
        return self.__new__(self.storage.__arcsin__())
    
    def __arccos__(self):
        return self.__new__(self.storage.__arccos__())
    
    def __arctan__(self):
        return self.__new__(self.storage.__arctan__())
    
    def __exp__(self):
        return self.__new__(self.storage.__exp__())

    def __prod__(self, axis = None):
        return self.__new__(self.storage.__prod__(axis))
    
    def max(self, axis = None, out = None):
        if axis is None :
            return self.storage.max()
        else :
            if out is None :
                return self.__new__(self.storage.max(axis))
            else :
                if isinstance(out, SimpleData) :
                    obj = out.storage
                else :
                    obj = out
                self.storage.max(axis, obj)
                return out
    
    def min(self, axis = None, out = None):
        if axis is None :
            return self.storage.min()
        else :
            if out is None :
                return self.__new__(self.storage.min(axis))
            else :
                if isinstance(out, SimpleData) :
                    obj = out.storage
                else :
                    obj = out
                self.storage.min(axis, obj)
                return out
    
    def argmax(self, axis = None):
        return self.storage.argmax(axis)

    def argmin(self, axis = None):
        return self.storage.argmin(axis)
        
    def sum(self, axis = None, dtype = None, out = None):
        if axis is None :
            return self.storage.sum(dtype = dtype)
        else :
            if out is None :
                return self.__new__(self.storage.sum(axis, dtype))
            else :
                return self.storage.sum(axis, dtype, out)
            
    def transpose(self, axes = None):
        return self.__new__(self.storage.transpose(axes))
        
    def compress(self, condition, axis = None, out = None):
        return self.__new__(self.storage.compress(condition, axis, out))

    def clip(self, a_min, a_max, out = None):
        if out is None:
            return self.__new__(self.storage.clip(a_min, a_max))
        else :
            if hasattr(out, 'storage'):
                self.storage.clip(a_min, a_max, out.storage)
            else:
                self.storage.clip(a_min, a_max, out)
            return out
        
    def mean(self, axis = None, dtype = None, out = None):
        if axis is None :
            return self.storage.mean(dtype = dtype)
        else :
            if out is None :
                return self.__new__(self.storage.mean(axis, dtype))
            else :
                return self.storage.mean(axis, dtype, out)
#********************************************************************************
#     Array utilities
#********************************************************************************
    
    def __repr__(self, indent = ''):
        indent += '           '
        res = 'SimpleData(' + self.storage.__repr__(indent) + ', \n' \
                + indent + 'title=\'' + self.title + '\''
        if not self.units is None :
            res += ',\n' + indent + 'units=\'' + self.units + '\''
        res += ')'
        return res
    
    def __str__(self, indent = ''):
        if self.dtype is str :
            return indent + self.storage.__str__(indent)
        res = 'title: ' + self.title + '\n' + indent
        if not self.units is None and len(self.units) > 0:
            res += 'units: ' + self.units + '\n' + indent
        res += 'storage: ' + self.storage.__str__(indent + ' ' * 9) 
        return res
    
    def tolist(self):
        return self.storage.tolist()
            
#####################################################################################
#   Array modification
#####################################################################################    

    def __setitem__(self, index, value):
        if isinstance(value, SimpleData) :
            value = value.storage
        self.storage[index] = value
    
    def copy_from(self, value, length = -1):
        if isinstance(value, SimpleData) :
            value = value.storage
        self.storage.copy_from(value, length)
                    
    def fill(self, val):
        self.storage.fill(val)
            
    def put(self, indices, values, mode='raise') :
        self.storage.put(indices, values, mode)
        
#####################################################################################
#   Reinterpreting arrays
#####################################################################################    
    def reshape(self, shape): 
        return self.__new__(self.storage.reshape(shape))
    
    def flatten(self) :
        return self.__new__(self.storage.flatten())

    def view_1d(self):
        return self.__new__(self.storage.view_1d())
    
    def __copy__(self):
        return self.__new__(self.storage.__copy__())

    def __deepcopy__(self):
        return self.__new__(self.storage.__deepcopy__())
    
    def float_copy(self):
        return self.__new__(self.storage.float_copy())

    def positive_float_copy(self):
        return self.__new__(self.storage.positive_float_copy())

    def __new__(self, storage, units = None, parent = None, title = None):
        name = self.name
        if units is None :
            units = self.units
        if title is None :
            title = self.title
        sd = new(storage, name, units, parent, title)
        for att in self.__iDataItem__.getAttributeList():
            sd.__iDataItem__.addOneAttribute(att)
        return sd

    def __dir__(self):
        dirs = self.storage.__dir__()
        dirs.append('name')
        dirs.append('storage')
        dirs.append('title')
        dirs.append('units')
        return sorted(dirs)
        
    def all(self):
        return self.storage.all()
    
    def any(self):
        return self.storage.any()

    def get_flawed_indices(self):
        return self.__iDataItem__.getFlawedIndexList()
     
    def delete_slice(self, indices):
        slices = []
        if type(indices) is int :
            slices = [indices]
        elif hasattr(indices, '__len__') :
            slices = indices
        else :
            raise AttributeError, 'indices must be either integer value or integer list'
        if len(slices) > 0 :
            narr = array.delete(self.storage, slices, 0)
            oname = self.__iDataItem__.getShortName()
            self.__iDataItem__ = nx_factory.\
                            createNXsignal(None, oname, narr.__iArray__)
            self.storage = narr
    
    def intg(self, axis = None, out = None, keepdims = False):
        if axis is None :
            return self.storage.intg()
        else :
            if out is None :
                return self.__new__(self.storage.intg(axis, out, keepdims))
            else :
                return self.storage.intg(axis, out, keepdims)