def setshape(self, shape, *args): """Change array shape in place. Call as setshape(i,j,k) or setshape((i,j,k)).""" if not self.iscontiguous(): raise ValueError("Can't reshape non-contiguous numarray") shape = list(getShape(shape, *args)) # look for index = -1, which indicates an expandable dimension nelements = self.nelements() negcount = shape.count(-1) if negcount > 1: raise ValueError("no more than one dimension can have value -1") elif negcount == 1: tnelements = abs(product(shape)) shape[shape.index(-1)] = nelements/tnelements newnelements = product(shape) if newnelements == nelements: self._shape = tuple(shape) self._strides = self._stridesFromShape() else: raise ValueError("New shape is not consistent with the old shape")
def copy(self): """Return a new array with the same shape and type, but a copy of the data""" arr = self.view() arr._data = memory.new_memory(arr._itemsize * arr.nelements()) arr._byteoffset = 0 arr._bytestride = arr._itemsize arr._strides = arr._stridesFromShape() arr._itemsize = self._itemsize # now copy data, if possible using larger units if product(self._shape): fname = "copy"+str(self._itemsize)+"bytes" copyfunction = ((self.isaligned() and _bytes.functionDict.get(fname)) or _bytes.functionDict["copyNbytes"]) copyfunction(arr._shape, self._data, self._byteoffset, self._strides, arr._data, 0, arr._strides, arr._itemsize) return arr
def resize(self, shape, *args): """ resize() shrinks/grows 'self' to new 'shape', possibly replacing the underlying buffer object. """ shape = getShape(shape, *args) nlen = product(shape) if nlen < 0: raise ValueError("Negative shape dims don't work with resize") olen = self.nelements() if (isinstance(self._data, _types.BufferType) or isinstance(self._data, memory.MemoryType)): if self.iscontiguous(): oself = self.view() else: oself = self.copy() self._data = memory.new_memory(nlen*self._itemsize) self._bytestride = self._itemsize self._byteoffset = 0 blen = min(nlen, olen) self.ravel() oself.ravel() self[:blen] = oself[:blen] else: # Memmap self._data.resize(nlen*self._itemsize) self._shape = (nlen,) self._strides = self._stridesFromShape() if olen: # use any existing data as a pattern to be repeated if nlen > olen: offset = olen while offset+olen <= nlen: self[offset:offset+olen] = self[0:olen] offset += olen self[offset:nlen] = self[0:nlen-offset] else: # zero fill resized zero-length numarray self[:] = 0 self._shape = shape self._strides = self._stridesFromShape() return self