def getShape(shape, *args): """Verifies that this is a legal shape specification and returns tuple Shape can be an integer or a sequence of integers. Also can pass several integer arguments. Raises an exception on problems. """ try: if shape is () and not args: return () if type(shape) in [_types.IntType, _types.LongType]: shape = (shape,) + args else: if args: raise TypeError shape = tuple(shape) if _isIntegerSequence(shape): return shape except TypeError: pass raise TypeError("Shape must be sequence of integers")
def _universalIndexing(self, key, value=None): """Handles both getting (value == None) and setting (value != None)""" if isinstance(key, int) and len(self._shape) == 1: if key < 0: key += self._shape[0]; if not 0 <= key < self._shape[0]: raise IndexError("Index out of range") offset = self._strides[0]*key + self._byteoffset if value is None: return self._getitem(offset) else: return self._setitem(offset, value) if isinstance(value, (list,tuple)): fvalue = self.factory(value) else: fvalue = value # Make simple types and arrays into a 1-element tuple. if isinstance(key, (_types.SliceType, _types.EllipsisType, int, long, _nc.NumArray)): tkey = (key,) elif isinstance(key, list): if isinstance(key[0], _types.SliceType): tkey = tuple(key) else: tkey = (key,) else: tkey = key if not isinstance(tkey, tuple): raise IndexError("Illegal index") tkey2 = list(tkey) if _isIntegerSequence(tkey2): return self._simpleIndexing(tkey2, fvalue) elif self._isSlice(tkey): # i.e., no numarrays... return self._slicedIndexing(tkey2, fvalue) else: return self._arrayIndexing(tkey2, fvalue)