Example #1
0
 def totensor(self):
     """returns a new tensor object that contains the same values"""
     temp = numpy.ndarray(self.shape);
     temp.fill(0);
     
     for i in range(0, len(self.vals)):
         temp.put(tools.sub2ind(self.shape, self.subs[i])[0], self.vals[i][0]);
     
     return tensor.tensor(temp, self.shape);
Example #2
0
 def totensor(self):
     """returns a new tensor object that contains the same values"""
     temp = numpy.ndarray(self.shape);
     temp.fill(0);
     
     for i in range(0, len(self.vals)):
         temp.put(tools.sub2ind(self.shape, self.subs[i])[0], self.vals[i][0]);
     
     return tensor.tensor(temp, self.shape);
Example #3
0
def tendiag(vals, shape=None):
    """special constructor, construc a tensor with the values in the diagonal"""

    #if shape is None or
    #number of dimensions of shape is less than the number of values given
    if (shape == None or len(shape) < len(vals)):
        shape = [len(vals)] * len(vals)
    else:
        shape = list(shape)
        for i in range(0, len(vals)):
            if (shape[i] < len(vals)):
                shape[i] = len(vals)

    data = numpy.ndarray(shape)
    data.fill(0)

    # put the values in the ndarray
    for i in range(0, len(vals)):
        data.put(tools.sub2ind(shape, [i] * len(shape)), vals[i])
    return tensor(data, shape)
Example #4
0
def tendiag(vals, shape=None):
    """special constructor, construc a tensor with the values in the diagonal"""
    
    #if shape is None or
    #number of dimensions of shape is less than the number of values given
    if (shape == None or len(shape) < len(vals)):
        shape = [len(vals)]*len(vals);
    else:
        shape = list(shape);
        for i in range(0, len(vals)):
            if(shape[i] < len(vals)):
                shape[i] = len(vals);
    
    data = numpy.ndarray(shape);
    data.fill(0);
    
    # put the values in the ndarray
    for i in range(0, len(vals)):
        data.put(tools.sub2ind(shape,[i]*len(shape)), vals[i]);
    return tensor(data, shape);    
    
Example #5
0
    def __init__(self, T, rdim=None, cdim=None, tsiz=None, option=None):
        """Create a sptenmat object from a given ndarray or sptensor T"""

        if (rdim != None and rdim.__class__ == list):
            rdim = numpy.array(rdim)
        if (cdim != None and cdim.__class__ == list):
            cdim = numpy.array(cdim)
        if (tsiz != None and tsiz.__class__ == list):
            tsiz = numpy.array(tsiz)

        #subs, vals, rdims, cdims, tsize are all given

        #When I is a (2-D) ndarray or sptensor, and rdim, cdim, tsiz are given
        if (rdim != None and cdim != None and tsiz != None):

            B = T.flatten().reshape(len(T), T.size / len(T))
            subs = []
            vals = []
            maxrowind = 0
            maxcolind = 0
            for i in range(0, len(B)):
                for j in range(0, len(B[0])):
                    if (B[i][j] != 0):
                        subs.extend([[i, j]])
                        vals.extend([B[i][j]])
                        if (i > maxrowind): maxrowind = i
                        if (j > maxcolind): maxcolind = j

            self.subs = numpy.array(subs)
            self.vals = numpy.array(vals)
            self.rdims = rdim.copy()
            self.cdims = cdim.copy()
            self.tsize = tsiz

            n = len(self.tsize)

            temp = numpy.concatenate((self.rdims, self.cdims))
            temp.sort()
            if not ((numpy.arange(n) == temp).all()):
                raise ValueError("Incorrect specification of dimensions")
            if (tools.getelts(self.tsize, self.rdims).prod() < maxrowind):
                raise ValueError("error, invalid row index")
            if (tools.getelts(self.tsize, self.cdims).prod() < maxcolind):
                raise ValueError("error, invalid column index")
            return

        # T is a sptensor
        T = T.copy()
        self.tsize = T.shape
        self.subs = T.subs
        self.vals = T.vals
        n = T.ndims()

        if (rdim != None):
            if (cdim != None):
                self.rdims = rdim
                self.cdims = cdim

            elif (option != None):
                if (option == 'fc'):
                    self.rdims = rdim
                    if (self.rdims.size != 1):
                        raise ValueError(
                            "only one row dimension for 'fc' option")

                    self.cdims = []
                    for i in range(self.rdim[0] + 1, n):
                        self.cdims.append(i)
                    for i in range(0, self.rdim[0]):
                        self.cdims.append(i)
                    self.cdims = numpy.array(self.cdims)

                elif (option == 'bc'):
                    self.rdims = rdim
                    if (self.rdims.size != 1):
                        raise ValueError(
                            "only one row dimension for 'bc' option")

                    self.cdims = []
                    for i in range(0, self.rdim[0])[::-1]:
                        self.cdims.append(i)
                    for i in range(self.rdim[0] + 1, n)[::-1]:
                        self.cdims.append(i)
                    self.cdims = numpy.array(self.cdims)

                else:
                    raise ValueError("unknown option: {0}".format(option))

            else:
                self.rdims = rdim
                self.cdims = tools.notin(n, self.rdims)

        elif (cdim != None):
            self.cdims = cdim
            if (option == 't'):
                self.rdims = tools.notin(n, self.cdims)
            else:
                raise ValueError("unknown option: {0}".format(option))
        else:
            raise ValueError("Both rdims and cdims are None")

        #error check
        temp = numpy.concatenate((self.rdims, self.cdims))
        temp.sort()
        if not ((numpy.arange(n) == temp).all()):
            raise ValueError("Incorrect specification of dimensions")

        rsize = tools.getelts(self.tsize, self.rdims)
        csize = tools.getelts(self.tsize, self.cdims)

        if (len(rsize) == 0):
            ridx = numpy.ndarray([T.nnz()])
            ridx.fill(0)
        else:
            temp1 = []
            for i in range(0, len(self.subs)):
                temp2 = []
                for j in range(0, len(self.rdims)):
                    temp2.extend([self.subs[i][self.rdims[j]]])
                temp1.extend([temp2])
            temp1 = numpy.array(temp1)
            ridx = tools.sub2ind(rsize, temp1)

        if (len(csize) == 0):
            cidx = numpy.ndarray([T.nnz()])
            cidx.fill(0)

        else:
            temp1 = []
            for i in range(0, len(self.subs)):
                temp2 = []
                for j in range(0, len(self.cdims)):
                    temp2.extend([self.subs[i][self.cdims[j]]])
                temp1.extend([temp2])

            temp1 = numpy.array(temp1)
            cidx = tools.sub2ind(csize, temp1)

        self.subs = []
        for i in range(0, len(ridx)):
            self.subs.extend([[ridx[i][0], cidx[i][0]]])
        self.subs = numpy.array(self.subs)
Example #6
0
 def __init__(self, T, rdim = None, cdim = None, tsiz = None, option = None):
     """Create a sptenmat object from a given ndarray or sptensor T"""
            
     if(rdim != None and rdim.__class__ == list):
         rdim = numpy.array(rdim);
     if(cdim != None and cdim.__class__ == list):
         cdim = numpy.array(cdim);
     if(tsiz != None and tsiz.__class__ == list):
         tsiz = numpy.array(tsiz);
     
     #subs, vals, rdims, cdims, tsize are all given
     
     #When I is a (2-D) ndarray or sptensor, and rdim, cdim, tsiz are given
     if(rdim != None and cdim != None and tsiz != None):
         
         B = T.flatten().reshape(len(T), T.size / len(T));
         subs = [];
         vals = [];
         maxrowind = 0;
         maxcolind = 0;
         for i in range(0,len(B)):
             for j in range(0, len(B[0])):
                 if(B[i][j] != 0):
                     subs.extend([[i,j]]);
                     vals.extend([B[i][j]]);
                     if(i > maxrowind): maxrowind = i;
                     if(j > maxcolind): maxcolind = j;
         
         self.subs = numpy.array(subs);
         self.vals = numpy.array(vals);
         self.rdims = rdim.copy();
         self.cdims = cdim.copy();
         self.tsize = tsiz;
         
         n = len(self.tsize);
         
         temp = numpy.concatenate((self.rdims,self.cdims));
         temp.sort();
         if not ((numpy.arange(n) == temp).all()):
             raise ValueError ("Incorrect specification of dimensions");
         if (tools.getelts(self.tsize, self.rdims).prod() < maxrowind):
             raise ValueError ("error, invalid row index");
         if (tools.getelts(self.tsize, self.cdims).prod() < maxcolind):
             raise ValueError ("error, invalid column index");
         return;
 
 
     # T is a sptensor
     T = T.copy();
     self.tsize = T.shape;
     self.subs = T.subs;
     self.vals = T.vals;
     n = T.ndims();
     
     if (rdim != None):
         if(cdim != None):
             self.rdims = rdim;
             self.cdims = cdim;
             
         elif(option != None):
             if(option == 'fc'):
                 self.rdims = rdim;
                 if(self.rdims.size != 1):
                     raise ValueError ("only one row dimension for 'fc' option");
                 
                 self.cdims = [];
                 for i in range(self.rdim[0]+1,n):
                     self.cdims.append(i);
                 for i in range(0, self.rdim[0]):
                     self.cdims.append(i);
                 self.cdims = numpy.array(self.cdims);
                 
                 
             elif(option == 'bc'):
                 self.rdims = rdim;
                 if(self.rdims.size != 1):
                     raise ValueError ("only one row dimension for 'bc' option");
                 
                 
                 self.cdims = [];
                 for i in range(0, self.rdim[0])[::-1]:
                     self.cdims.append(i);
                 for i in range(self.rdim[0]+1,n)[::-1]:
                     self.cdims.append(i);
                 self.cdims = numpy.array(self.cdims);
                                     
             else:
                 raise ValueError ("unknown option: {0}".format(option));
         
         else:
             self.rdims = rdim;
             self.cdims = tools.notin(n, self.rdims);
             
     elif(cdim != None):
         self.cdims = cdim;
         if(option == 't'):
             self.rdims = tools.notin(n, self.cdims);
         else:
             raise ValueError ("unknown option: {0}".format(option));
     else:
         raise ValueError("Both rdims and cdims are None");
 
 
     #error check
     temp = numpy.concatenate((self.rdims,self.cdims));
     temp.sort();
     if not ((numpy.arange(n) == temp).all()):
         raise ValueError ("Incorrect specification of dimensions");
         
     rsize = tools.getelts(self.tsize, self.rdims);
     csize = tools.getelts(self.tsize, self.cdims);
     
     
     if (len(rsize) == 0):
         ridx = numpy.ndarray([T.nnz()]);
         ridx.fill(0);
     else:
         temp1 = [];
         for i in range (0, len(self.subs)):
             temp2 = [];
             for j in range(0, len(self.rdims)):
                 temp2.extend([self.subs[i][self.rdims[j]]]);
             temp1.extend([temp2]);
         temp1 = numpy.array(temp1);
         ridx = tools.sub2ind(rsize, temp1);
         
 
     if (len(csize) == 0):
         cidx = numpy.ndarray([T.nnz()]);
         cidx.fill(0);
         
     else:
         temp1 = [];
         for i in range (0, len(self.subs)):
             temp2 = [];
             for j in range(0, len(self.cdims)):
                 temp2.extend([self.subs[i][self.cdims[j]]]);
             temp1.extend([temp2]);
             
         temp1 = numpy.array(temp1);
         cidx = tools.sub2ind(csize, temp1);
         
     
     self.subs = [];
     for i in range(0,len(ridx)):
         self.subs.extend([[ridx[i][0], cidx[i][0]]]);
     self.subs = numpy.array(self.subs);