diff options
Diffstat (limited to 'numpy/base/numeric.py')
-rw-r--r-- | numpy/base/numeric.py | 428 |
1 files changed, 428 insertions, 0 deletions
diff --git a/numpy/base/numeric.py b/numpy/base/numeric.py new file mode 100644 index 000000000..03a2e520f --- /dev/null +++ b/numpy/base/numeric.py @@ -0,0 +1,428 @@ +__all__ = ['newaxis', 'ndarray', 'bigndarray', 'flatiter', 'ufunc', + 'arange', 'array', 'zeros', 'empty', 'broadcast', 'dtypedescr', + 'fromstring', 'fromfile', 'frombuffer','newbuffer','getbuffer', + 'where', 'concatenate', 'fastCopyAndTranspose', 'lexsort', + 'register_dtype', 'set_numeric_ops', 'can_cast', + 'asarray', 'asanyarray', 'isfortran', 'zeros_like', 'empty_like', + 'correlate', 'convolve', 'inner', 'dot', 'outer', 'vdot', + 'alterdot', 'restoredot', 'cross', + 'array2string', 'get_printoptions', 'set_printoptions', + 'array_repr', 'array_str', 'set_string_function', + 'little_endian', + 'indices', 'fromfunction', + 'load', 'loads', + 'ones', 'identity', 'allclose', + 'seterr', 'geterr', 'setbufsize', 'getbufsize', + 'seterrcall', 'geterrcall', + 'Inf', 'inf', 'infty', 'Infinity', + 'nan', 'NaN'] + +import sys +import multiarray +import umath +from umath import * +import numerictypes +from numerictypes import * + +def extend_all(module): + adict = {} + for a in __all__: + adict[a] = 1 + try: + mall = getattr(module, '__all__') + except AttributeError: + mall = [k for k in module.__dict__.keys() if not k.startswith('_')] + for a in mall: + if a not in adict: + __all__.append(a) + +extend_all(umath) +extend_all(numerictypes) + +newaxis = None + +ndarray = multiarray.ndarray +bigndarray = multiarray.bigndarray +flatiter = multiarray.flatiter +broadcast = multiarray.broadcast +dtypedescr=multiarray.dtypedescr +ufunc = type(sin) + +arange = multiarray.arange +array = multiarray.array +zeros = multiarray.zeros +empty = multiarray.empty +fromstring = multiarray.fromstring +fromfile = multiarray.fromfile +frombuffer = multiarray.frombuffer +newbuffer = multiarray.newbuffer +getbuffer = multiarray.getbuffer +where = multiarray.where +concatenate = multiarray.concatenate +fastCopyAndTranspose = multiarray._fastCopyAndTranspose +register_dtype = multiarray.register_dtype +set_numeric_ops = multiarray.set_numeric_ops +can_cast = multiarray.can_cast +lexsort = multiarray.lexsort + + +def asarray(a, dtype=None, fortran=False): + """returns a as an array. Unlike array(), + no copy is performed if a is already an array. Subclasses are converted + to base class ndarray. + """ + return array(a, dtype, copy=False, fortran=fortran) + +def asanyarray(a, dtype=None, copy=False, fortran=False): + """will pass subclasses through... + """ + return array(a, dtype, copy=False, fortran=fortran, subok=1) + +def isfortran(a): + return a.flags['FNC'] + +# from Fernando Perez's IPython +def zeros_like(a): + """Return an array of zeros of the shape and typecode of a. + + If you don't explicitly need the array to be zeroed, you should instead + use empty_like(), which is faster as it only allocates memory.""" + a = asanyarray(a) + return a.__array_wrap__(zeros(a.shape, a.dtype, a.flags['FNC'])) + +def empty_like(a): + """Return an empty (uninitialized) array of the shape and typecode of a. + + Note that this does NOT initialize the returned array. If you require + your array to be initialized, you should use zeros_like(). + + """ + a = asanyarray(a) + return a.__array_wrap__(empty(a.shape, a.dtype, a.flags['FNC'])) + +# end Fernando's utilities + +_mode_from_name_dict = {'v': 0, + 's' : 1, + 'f' : 2} + +def _mode_from_name(mode): + if isinstance(mode, type("")): + return _mode_from_name_dict[mode.lower()[0]] + return mode + +def correlate(a,v,mode='valid'): + mode = _mode_from_name(mode) + return multiarray.correlate(a,v,mode) + + +def convolve(a,v,mode='full'): + """Returns the discrete, linear convolution of 1-D + sequences a and v; mode can be 0 (valid), 1 (same), or 2 (full) + to specify size of the resulting sequence. + """ + if (len(v) > len(a)): + a, v = v, a + mode = _mode_from_name(mode) + return multiarray.correlate(a,asarray(v)[::-1],mode) + + +inner = multiarray.inner +dot = multiarray.dot + +def outer(a,b): + """outer(a,b) returns the outer product of two vectors. + result(i,j) = a(i)*b(j) when a and b are vectors + Will accept any arguments that can be made into vectors. + """ + a = asarray(a) + b = asarray(b) + return a.ravel()[:,newaxis]*b.ravel()[newaxis,:] + +def vdot(a, b): + """Returns the dot product of 2 vectors (or anything that can be made into + a vector). NB: this is not the same as `dot`, as it takes the conjugate + of its first argument if complex and always returns a scalar.""" + return dot(asarray(a).ravel().conj(), asarray(b).ravel()) + +# try to import blas optimized dot if available +try: + # importing this changes the dot function for basic 4 types + # to blas-optimized versions. + from _dotblas import dot, vdot, inner, alterdot, restoredot +except ImportError: + def alterdot(): + pass + def restoredot(): + pass + + +def _move_axis_to_0(a, axis): + if axis == 0: + return a + n = a.ndim + if axis < 0: + axis += n + axes = range(1, axis+1) + [0,] + range(axis+1, n) + return a.transpose(axes) + +def cross(a, b, axisa=-1, axisb=-1, axisc=-1): + """Return the cross product of two (arrays of) vectors. + + The cross product is performed over the last axis of a and b by default, + and can handle axes with dimensions 2 and 3. For a dimension of 2, + the z-component of the equivalent three-dimensional cross product is + returned. + """ + a = _move_axis_to_0(asarray(a), axisa) + b = _move_axis_to_0(asarray(b), axisb) + msg = "incompatible dimensions for cross product\n"\ + "(dimension must be 2 or 3)" + if (a.shape[0] not in [2,3]) or (b.shape[0] not in [2,3]): + raise ValueError(msg) + if a.shape[0] == 2: + if (b.shape[0] == 2): + cp = a[0]*b[1] - a[1]*b[0] + if cp.ndim == 0: + return cp + else: + return cp.swapaxes(0,axisc) + else: + x = a[1]*b[2] + y = -a[0]*b[2] + z = a[0]*b[1] - a[1]*b[0] + elif a.shape[0] == 3: + if (b.shape[0] == 3): + x = a[1]*b[2] - a[2]*b[1] + y = a[2]*b[0] - a[0]*b[2] + z = a[0]*b[1] - a[1]*b[0] + else: + x = -a[2]*b[1] + y = a[2]*b[0] + z = a[0]*b[1] - a[1]*b[0] + cp = array([x,y,z]) + if cp.ndim == 1: + return cp + else: + return cp.swapaxes(0,axisc) + + +#Use numarray's printing function +from arrayprint import array2string, get_printoptions, set_printoptions + +_typelessdata = [int_, float_, complex_] +if issubclass(intc, int): + _typelessdata.append(intc) + +if issubclass(longlong, int): + _typelessdata.append(longlong) + +def array_repr(arr, max_line_width=None, precision=None, suppress_small=None): + if arr.size > 0 or arr.shape==(0,): + lst = array2string(arr, max_line_width, precision, suppress_small, + ', ', "array(") + else: # show zero-length shape unless it is (0,) + lst = "[], shape=%s" % (repr(arr.shape),) + typeless = arr.dtype in _typelessdata + + if arr.__class__ is not ndarray: + cName= arr.__class__.__name__ + else: + cName = "array" + if typeless and arr.size: + return cName + "(%s)" % lst + else: + typename=arr.dtype.__name__[:-8] + if issubclass(arr.dtype, flexible): + if typename not in ['unicode','string','void']: + typename = arr.dtype.__name__ + typename = "(%s,%d)" % (typename, arr.itemsize) + return cName + "(%s, dtype=%s)" % (lst, typename) + +def array_str(a, max_line_width=None, precision=None, suppress_small=None): + return array2string(a, max_line_width, precision, suppress_small, ' ', "") + +set_string_function = multiarray.set_string_function +set_string_function(array_str, 0) +set_string_function(array_repr, 1) + + +little_endian = (sys.byteorder == 'little') + +def indices(dimensions, dtype=int_): + """indices(dimensions,dtype=int_) returns an array representing a grid + of indices with row-only, and column-only variation. + """ + tmp = ones(dimensions, dtype) + lst = [] + for i in range(len(dimensions)): + lst.append( add.accumulate(tmp, i, )-1 ) + return array(lst) + +def fromfunction(function, dimensions, **kwargs): + """fromfunction(function, dimensions) returns an array constructed by + calling function on a tuple of number grids. The function should + accept as many arguments as there are dimensions which is a list of + numbers indicating the length of the desired output for each axis. + + The function can also accept keyword arguments which will be + passed in as well. + """ + args = indices(dimensions) + return function(*args,**kwargs) + + +from cPickle import load, loads +_cload = load +_file = file + +def load(file): + if isinstance(file, type("")): + file = _file(file,"rb") + return _cload(file) + +# These are all essentially abbreviations +# These might wind up in a special abbreviations module + +def ones(shape, dtype=int_, fortran=False): + """ones(shape, dtype=int_) returns an array of the given + dimensions which is initialized to all ones. + """ + # This appears to be slower... + #a = empty(shape, dtype, fortran) + #a.fill(1) + a = zeros(shape, dtype, fortran) + a+=1 + return a + +def identity(n,dtype=int_): + """identity(n) returns the identity matrix of shape n x n. + """ + a = array([1]+n*[0],dtype=dtype) + b = empty((n,n),dtype=dtype) + b.flat = a + return b + +def allclose (a, b, rtol=1.e-5, atol=1.e-8): + """ allclose(a,b,rtol=1.e-5,atol=1.e-8) + Returns true if all components of a and b are equal + subject to given tolerances. + The relative error rtol must be positive and << 1.0 + The absolute error atol comes into play for those elements + of y that are very small or zero; it says how small x must be also. + """ + x = array(a, copy=False) + y = array(b, copy=False) + d = less(absolute(x-y), atol + rtol * absolute(y)) + return d.ravel().all() + +def _setpyvals(lst, frame, where=0): + if not isinstance(lst, list) or len(lst) != 3: + raise ValueError, "Invalid pyvalues (length 3 list needed)." + + try: + wh = where.lower()[0] + except (AttributeError, TypeError, IndexError): + wh = None + + if where==0 or wh == 'l': + frame.f_locals[UFUNC_PYVALS_NAME] = lst + elif where == 1 or wh == 'g': + frame.f_globals[UFUNC_PYVALS_NAME] = lst + elif where == 2 or wh == 'b': + frame.f_builtins[UFUNC_PYVALS_NAME] = lst + + umath.update_use_defaults() + return + +def _getpyvals(frame): + try: + return frame.f_locals[UFUNC_PYVALS_NAME] + except KeyError: + try: + return frame.f_globals[UFUNC_PYVALS_NAME] + except KeyError: + try: + return frame.f_builtins[UFUNC_PYVALS_NAME] + except KeyError: + return [UFUNC_BUFSIZE_DEFAULT, ERR_DEFAULT, None] + +_errdict = {"ignore":ERR_IGNORE, + "warn":ERR_WARN, + "raise":ERR_RAISE, + "call":ERR_CALL} + +_errdict_rev = {} +for key in _errdict.keys(): + _errdict_rev[_errdict[key]] = key +del key + +def seterr(divide="ignore", over="ignore", under="ignore", + invalid="ignore", where=0): + maskvalue = ((_errdict[divide] << SHIFT_DIVIDEBYZERO) + + (_errdict[over] << SHIFT_OVERFLOW ) + + (_errdict[under] << SHIFT_UNDERFLOW) + + (_errdict[invalid] << SHIFT_INVALID)) + + frame = sys._getframe().f_back + pyvals = _getpyvals(frame) + pyvals[1] = maskvalue + _setpyvals(pyvals, frame, where) + +def geterr(): + frame = sys._getframe().f_back + maskvalue = _getpyvals(frame)[1] + + mask = 3 + res = {} + val = (maskvalue >> SHIFT_DIVIDEBYZERO) & mask + res['divide'] = _errdict_rev[val] + val = (maskvalue >> SHIFT_OVERFLOW) & mask + res['over'] = _errdict_rev[val] + val = (maskvalue >> SHIFT_UNDERFLOW) & mask + res['under'] = _errdict_rev[val] + val = (maskvalue >> SHIFT_INVALID) & mask + res['invalid'] = _errdict_rev[val] + return res + +def setbufsize(size, where=0): + if size > 10e6: + raise ValueError, "Very big buffers.. %s" % size + + frame = sys._getframe().f_back + pyvals = _getpyvals(frame) + pyvals[0] = size + _setpyvals(pyvals, frame, where) + +def getbufsize(): + frame = sys._getframe().f_back + return _getpyvals(frame)[0] + +def seterrcall(func, where=0): + if not callable(func): + raise ValueError, "Only callable can be used as callback" + frame = sys._getframe().f_back + pyvals = _getpyvals(frame) + pyvals[2] = func + _setpyvals(pyvals, frame, where) + +def geterrcall(): + frame = sys._getframe().f_back + return _getpyvals(frame)[2] + +def _setdef(): + frame = sys._getframe() + defval = [UFUNC_BUFSIZE_DEFAULT, ERR_DEFAULT, None] + frame.f_globals[UFUNC_PYVALS_NAME] = defval + frame.f_builtins[UFUNC_PYVALS_NAME] = defval + umath.update_use_defaults() + +# set the default values +_setdef() + +Inf = inf = infty = Infinity = PINF +nan = NaN = NAN + +import oldnumeric +from oldnumeric import * +extend_all(oldnumeric) |