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);
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)
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);
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)
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);