def __init__(self, array, ilat=0, ilon=1, LatLon=None, shape=()): '''Handle a C{NumPy} or C{Tuple} array as a sequence of C{LatLon} points. ''' ais = ('ilat', ilat), ('ilon', ilon) if len(shape) != 2 or shape[0] < 1 or shape[1] < len(ais): raise IndexError('%s shape invalid: %r' % ('array', shape)) self._array = array self._shape = shape # check the point class if LatLon is not None: if isclass(LatLon) and all( hasattr(LatLon, a) for a in LatLon_.__slots__): self._LatLon = LatLon else: raise TypeError('%s invalid: %r' % ('LatLon', LatLon)) # check the attr indices for n, (ai, i) in enumerate(ais): if not isint(i): raise TypeError('%s invalid: %r' % (ai, i)) i = int(i) if not 0 <= i < shape[1]: raise ValueError('%s invalid: %s' % (ai, i)) for aj, j in ais[:n]: if int(j) == i: raise ValueError('%s == %s == %s' % (ai, aj, i)) setattr(self, '_' + ai, i)
def subset(self, indices): '''Return a subset of the C{NumPy} array. @param indices: Row indices (C{range} or C{int}[]). @note: A I{subset} is different from a I{slice} in 2 ways: (a) the I{subset} is typically specified as a list of (un-)ordered indices and (b) the I{subset} allocates a new, separate C{NumPy} array while a I{slice} is just an other I{view} of the original C{NumPy} array. @return: Sub-array (C{numpy.array}). @raise IndexError: Out-of-range I{indices} value. @raise TypeError: If I{indices} is not a C{range} or C{int}[]. ''' if not issequence(indices, tuple): # NO tuple, only list # and range work properly to get Numpy array sub-sets raise TypeError('%s invalid: %s' % ('indices', type(indices))) n = len(self) for i, v in enumerate(indices): if not isint(v): raise TypeError('%s[%s] invalid: %r' % ('indices', i, v)) elif not 0 <= v < n: raise IndexError('%s[%s] invalid: %r' % ('indices', i, v)) return self._subset(indices)
def precision(form, prec=None): '''Set the default precison for a given F_ form. @param form: L{F_D}, L{F_DM}, L{F_DMS}, L{F_DEG}, L{F_MIN}, L{F_SEC} or L{F_RAD} (C{str}). @keyword prec: Optional number of decimal digits (0..9 or C{None} for default). Trailing zero decimals are stripped for I{prec} values of 1 and above, but kept for negative I{prec} values. @return: Previous precision (C{int}). @raise ValueError: Invalid I{form} or I{prec} or beyond valid range. ''' try: p = _F_prec[form] except KeyError: raise ValueError('%s invalid: %s' % ('form', form)) if isint(prec): if not -10 < prec < 10: raise ValueError('%s invalid: %s' % ('prec', prec)) _F_prec[form] = prec return p