def from_dtype(dtype): """ Return a Numba Type instance corresponding to the given Numpy *dtype*. NotImplementedError is raised on unsupported Numpy dtypes. """ if type(dtype) == type and issubclass(dtype, np.generic): dtype = np.dtype(dtype) elif getattr(dtype, "fields", None) is not None: return from_struct_dtype(dtype) try: return FROM_DTYPE[dtype] except KeyError: pass try: char = dtype.char except AttributeError: pass else: if char in 'SU': return _from_str_dtype(dtype) if char in 'mM': return _from_datetime_dtype(dtype) if char in 'V' and dtype.subdtype is not None: subtype = from_dtype(dtype.subdtype[0]) return types.NestedArray(subtype, dtype.shape) raise errors.NumbaNotImplementedError(dtype)
def as_dtype(nbtype): """ Return a numpy dtype instance corresponding to the given Numba type. NotImplementedError is if no correspondence is known. """ nbtype = types.unliteral(nbtype) if isinstance(nbtype, (types.Complex, types.Integer, types.Float)): return np.dtype(str(nbtype)) if nbtype is types.bool_: return np.dtype('?') if isinstance(nbtype, (types.NPDatetime, types.NPTimedelta)): letter = _as_dtype_letters[type(nbtype)] if nbtype.unit: return np.dtype('%s[%s]' % (letter, nbtype.unit)) else: return np.dtype(letter) if isinstance(nbtype, (types.CharSeq, types.UnicodeCharSeq)): letter = _as_dtype_letters[type(nbtype)] return np.dtype('%s%d' % (letter, nbtype.count)) if isinstance(nbtype, types.Record): return as_struct_dtype(nbtype) if isinstance(nbtype, types.EnumMember): return as_dtype(nbtype.dtype) if isinstance(nbtype, types.npytypes.DType): return as_dtype(nbtype.dtype) if isinstance(nbtype, types.NumberClass): return as_dtype(nbtype.dtype) if isinstance(nbtype, types.NestedArray): spec = (as_dtype(nbtype.dtype), tuple(nbtype.shape)) return np.dtype(spec) if isinstance(nbtype, types.PyObject): return np.dtype(object) msg = f"{nbtype} cannot be represented as a NumPy dtype" raise errors.NumbaNotImplementedError(msg)
def cast(self, builder, val, fromty, toty): """ Cast a value of type *fromty* to type *toty*. This implements implicit conversions as can happen due to the granularity of the Numba type system, or lax Python semantics. """ if fromty == toty or toty == types.Any: return val try: impl = self._casts.find((fromty, toty)) return impl(self, builder, fromty, toty, val) except errors.NumbaNotImplementedError: raise errors.NumbaNotImplementedError( "Cannot cast %s to %s: %s" % (fromty, toty, val))
def _find(self, sig): candidates = self._select_compatible(sig) if candidates: return candidates[self._best_signature(candidates)] else: raise errors.NumbaNotImplementedError(f'{self}, {sig}')