diff options
author | Mark Wiebe <mwwiebe@gmail.com> | 2011-08-23 16:38:31 -0700 |
---|---|---|
committer | Charles Harris <charlesr.harris@gmail.com> | 2011-08-27 07:27:00 -0600 |
commit | 64e30a7261e5a575a12beed1c3971f80779760f1 (patch) | |
tree | 9d57b9b83fbb1293717325e6557db33cfe932457 /numpy/core/fromnumeric.py | |
parent | 6d9a2a1e7a13f076cea5e38194d56e045706c1ba (diff) | |
download | numpy-64e30a7261e5a575a12beed1c3971f80779760f1.tar.gz |
ENH: missingdata: Add skipna=, keepdims= parameters to methods
Also fix some memory leaks, improve some type resolution code. The
methods still have some issues with array subtypes that needs working
through.
Diffstat (limited to 'numpy/core/fromnumeric.py')
-rw-r--r-- | numpy/core/fromnumeric.py | 87 |
1 files changed, 16 insertions, 71 deletions
diff --git a/numpy/core/fromnumeric.py b/numpy/core/fromnumeric.py index f3930eaa9..f374951c9 100644 --- a/numpy/core/fromnumeric.py +++ b/numpy/core/fromnumeric.py @@ -16,6 +16,7 @@ import multiarray as mu import umath as um import numerictypes as nt from numeric import asarray, array, asanyarray, concatenate +import _methods _dt_ = nt.sctype2char import types @@ -1482,12 +1483,12 @@ def sum(a, axis=None, dtype=None, out=None, skipna=False, keepdims=False): try: sum = a.sum except AttributeError: - return um.add.reduce(a, axis=axis, dtype=dtype, + return _methods._sum(a, axis=axis, dtype=dtype, out=out, skipna=skipna, keepdims=keepdims) # NOTE: Dropping the skipna and keepdims parameters here... return sum(axis=axis, dtype=dtype, out=out) else: - return um.add.reduce(a, axis=axis, dtype=dtype, + return _methods._sum(a, axis=axis, dtype=dtype, out=out, skipna=skipna, keepdims=keepdims) def product (a, axis=None, dtype=None, out=None, skipna=False, keepdims=False): @@ -1603,7 +1604,8 @@ def any(a, axis=None, out=None, skipna=False, keepdims=False): (191614240, 191614240) """ - return um.logical_or.reduce(a, axis=axis, out=out, skipna=skipna, keepdims=keepdims) + return _methods._any(a, axis=axis, out=out, + skipna=skipna, keepdims=keepdims) def all(a, axis=None, out=None, skipna=False, keepdims=False): """ @@ -1674,7 +1676,8 @@ def all(a, axis=None, out=None, skipna=False, keepdims=False): (28293632, 28293632, array([ True], dtype=bool)) """ - return um.logical_and.reduce(a, axis=axis, out=out, skipna=skipna, keepdims=keepdims) + return _methods._all(a, axis=axis, out=out, + skipna=skipna, keepdims=keepdims) def cumsum (a, axis=None, dtype=None, out=None): """ @@ -1873,12 +1876,12 @@ def amax(a, axis=None, out=None, skipna=False, keepdims=False): try: amax = a.max except AttributeError: - return um.maximum.reduce(a, axis=axis, + return _methods._amax(a, axis=axis, out=out, skipna=skipna, keepdims=keepdims) # NOTE: Dropping the skipna and keepdims parameters return amax(axis=axis, out=out) else: - return um.maximum.reduce(a, axis=axis, + return _methods._amax(a, axis=axis, out=out, skipna=skipna, keepdims=keepdims) def amin(a, axis=None, out=None, skipna=False, keepdims=False): @@ -1947,12 +1950,12 @@ def amin(a, axis=None, out=None, skipna=False, keepdims=False): try: amin = a.min except AttributeError: - return um.minimum.reduce(a, axis=axis, + return _methods._amin(a, axis=axis, out=out, skipna=skipna, keepdims=keepdims) # NOTE: Dropping the skipna and keepdims parameters return amin(axis=axis, out=out) else: - return um.minimum.reduce(a, axis=axis, + return _methods._amin(a, axis=axis, out=out, skipna=skipna, keepdims=keepdims) def alen(a): @@ -2080,11 +2083,11 @@ def prod(a, axis=None, dtype=None, out=None, skipna=False, keepdims=False): try: prod = a.prod except AttributeError: - return um.multiply.reduce(a, axis=axis, dtype=dtype, + return _methods._prod(a, axis=axis, dtype=dtype, out=out, skipna=skipna, keepdims=keepdims) return prod(axis=axis, dtype=dtype, out=out) else: - return um.multiply.reduce(a, axis=axis, dtype=dtype, + return _methods._prod(a, axis=axis, dtype=dtype, out=out, skipna=skipna, keepdims=keepdims) def cumprod(a, axis=None, dtype=None, out=None): @@ -2459,22 +2462,8 @@ def mean(a, axis=None, dtype=None, out=None, skipna=False, keepdims=False): except AttributeError: pass - arr = asarray(a) - - # Upgrade bool, unsigned int, and int to float64 - if dtype is None and arr.dtype.kind in ['b','u','i']: - ret = um.add.reduce(arr, axis=axis, dtype='f8', + return _methods._mean(a, axis=axis, dtype=dtype, out=out, skipna=skipna, keepdims=keepdims) - else: - ret = um.add.reduce(arr, axis=axis, dtype=dtype, - out=out, skipna=skipna, keepdims=keepdims) - rcount = mu.count_reduce_items(arr, axis=axis, - skipna=skipna, keepdims=keepdims) - if isinstance(ret, mu.ndarray): - um.true_divide(ret, rcount, out=ret, casting='unsafe') - else: - ret = ret / float(rcount) - return ret def std(a, axis=None, dtype=None, out=None, ddof=0, @@ -2579,16 +2568,9 @@ def std(a, axis=None, dtype=None, out=None, ddof=0, except AttributeError: pass - ret = var(a, axis=axis, dtype=dtype, out=out, ddof=ddof, + return _methods._std(a, axis=axis, dtype=dtype, out=out, ddof=ddof, skipna=skipna, keepdims=keepdims) - if isinstance(ret, mu.ndarray): - um.sqrt(ret, out=ret) - else: - ret = um.sqrt(ret) - - return ret - def var(a, axis=None, dtype=None, out=None, ddof=0, skipna=False, keepdims=False): """ @@ -2692,43 +2674,6 @@ def var(a, axis=None, dtype=None, out=None, ddof=0, except AttributeError: pass - arr = asarray(a) - - # First compute the mean, saving 'rcount' for reuse later - if dtype is None and arr.dtype.kind in ['b','u','i']: - arrmean = um.add.reduce(arr, axis=axis, dtype='f8', - skipna=skipna, keepdims=True) - else: - arrmean = um.add.reduce(arr, axis=axis, dtype=dtype, - skipna=skipna, keepdims=True) - rcount = mu.count_reduce_items(arr, axis=axis, - skipna=skipna, keepdims=True) - if isinstance(arrmean, mu.ndarray): - um.true_divide(arrmean, rcount, out=arrmean, casting='unsafe') - else: - arrmean = arrmean / float(rcount) - - # arr - arrmean - x = arr - arrmean - - # (arr - arrmean) ** 2 - if arr.dtype.kind == 'c': - um.multiply(x, um.conjugate(x), out=x) - x = x.real - else: - um.multiply(x, x, out=x) - - # add.reduce((arr - arrmean) ** 2, axis) - ret = um.add.reduce(x, axis=axis, dtype=dtype, out=out, + return _methods._var(a, axis=axis, dtype=dtype, out=out, ddof=ddof, skipna=skipna, keepdims=keepdims) - # add.reduce((arr - arrmean) ** 2, axis) / (n - ddof) - if not keepdims and isinstance(rcount, mu.ndarray): - rcount = rcount.squeeze(axis=axis) - rcount -= ddof - if isinstance(ret, mu.ndarray): - um.true_divide(ret, rcount, out=ret, casting='unsafe') - else: - ret = ret / float(rcount) - - return ret |