Author: tlinnet Date: Sat May 10 10:06:50 2014 New Revision: 23147 URL: http://svn.gna.org/viewcvs/relax?rev=23147&view=rev Log: Added lib/numpy_future.py.
This module is for implementing numpy function code from higher versions of numpy. The relax dependencies listed at the download page of relax: http://www.nmr-relax.com/download.html#Source_code_release currently only requires Numpy v. 1.0.4. task #7792: (https://gna.org/task/?7792) Make the dx.map write suggest chi surface values. Added: trunk/lib/numpy_future.py Added: trunk/lib/numpy_future.py URL: http://svn.gna.org/viewcvs/relax/trunk/lib/numpy_future.py?rev=23147&view=auto ============================================================================== --- trunk/lib/numpy_future.py (added) +++ trunk/lib/numpy_future.py Sat May 10 10:06:50 2014 @@ -0,0 +1,178 @@ +##################################################################################################################################################### +# # +# Copyright (c) 2005-2013, NumPy Developers. # +# # +# All rights reserved. # +# # +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: # +# # +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. # +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions # +# and the following disclaimer in the documentation and/or other materials provided with the distribution. # +# 3. Neither the name of the NumPy Developers nor the names of any contributors may be used to endorse or promote products derived from this # +# software without specific prior written permission. # +# # +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON # +# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # +# # +# The full license for NumPy is provided at: http://www.numpy.org/license.html. # +# This license is known under the terms: 3-clause license ("Revised BSD License", "New BSD License", or "Modified BSD License"). # +# This can be found here: http://opensource.org/licenses/BSD-3-Clause # +# # +#################################################################################################################################################### + +# Module docstring. +"""Module for implementing numpy function code from higher versions of numpy. The relax dependencies listed at +U{the download page of relax<http://www.nmr-relax.com/download.html#Source_code_release>}, currently only requires 1.0.4.""" + +# Python module imports. +import numpy as np +from numpy import add, array, isscalar, sort + +##################################################################### +# This is from source code of Numpy v. 1.6.1. # +##################################################################### + +def percentile(a, q, axis=None, out=None, overwrite_input=False): + """ + Compute the qth percentile of the data along the specified axis. + + Returns the qth percentile of the array elements. + + Parameters + ---------- + a : array_like + Input array or object that can be converted to an array. + q : float in range of [0,100] (or sequence of floats) + Percentile to compute which must be between 0 and 100 inclusive. + axis : int, optional + Axis along which the percentiles are computed. The default (None) + is to compute the median along a flattened version of the array. + out : ndarray, optional + Alternative output array in which to place the result. It must + have the same shape and buffer length as the expected output, + but the type (of the output) will be cast if necessary. + overwrite_input : bool, optional + If True, then allow use of memory of input array `a` for + calculations. The input array will be modified by the call to + median. This will save memory when you do not need to preserve + the contents of the input array. Treat the input as undefined, + but it will probably be fully or partially sorted. + Default is False. Note that, if `overwrite_input` is True and the + input is not already an array, an error will be raised. + + Returns + ------- + pcntile : ndarray + A new array holding the result (unless `out` is specified, in + which case that array is returned instead). If the input contains + integers, or floats of smaller precision than 64, then the output + data-type is float64. Otherwise, the output data-type is the same + as that of the input. + + See Also + -------- + mean, median + + Notes + ----- + Given a vector V of length N, the qth percentile of V is the qth ranked + value in a sorted copy of V. A weighted average of the two nearest + neighbors is used if the normalized ranking does not match q exactly. + The same as the median if ``q=0.5``, the same as the minimum if ``q=0`` + and the same as the maximum if ``q=1``. + + Examples + -------- + >>> a = np.array([[10, 7, 4], [3, 2, 1]]) + >>> a + array([[10, 7, 4], + [ 3, 2, 1]]) + >>> np.percentile(a, 50) + 3.5 + >>> np.percentile(a, 0.5, axis=0) + array([ 6.5, 4.5, 2.5]) + >>> np.percentile(a, 50, axis=1) + array([ 7., 2.]) + + >>> m = np.percentile(a, 50, axis=0) + >>> out = np.zeros_like(m) + >>> np.percentile(a, 50, axis=0, out=m) + array([ 6.5, 4.5, 2.5]) + >>> m + array([ 6.5, 4.5, 2.5]) + + >>> b = a.copy() + >>> np.percentile(b, 50, axis=1, overwrite_input=True) + array([ 7., 2.]) + >>> assert not np.all(a==b) + >>> b = a.copy() + >>> np.percentile(b, 50, axis=None, overwrite_input=True) + 3.5 + + """ + a = np.asarray(a) + + if q == 0: + return a.min(axis=axis, out=out) + elif q == 100: + return a.max(axis=axis, out=out) + + if overwrite_input: + if axis is None: + sorted = a.ravel() + sorted.sort() + else: + a.sort(axis=axis) + sorted = a + else: + sorted = sort(a, axis=axis) + if axis is None: + axis = 0 + + return _compute_qth_percentile(sorted, q, axis, out) + + +##################################################################### +# This is from source code of Numpy v. 1.6.1. # +##################################################################### + +# handle sequence of q's without calling sort multiple times +def _compute_qth_percentile(sorted, q, axis, out): + if not isscalar(q): + p = [_compute_qth_percentile(sorted, qi, axis, None) + for qi in q] + + if out is not None: + out.flat = p + + return p + + q = q / 100.0 + if (q < 0) or (q > 1): + raise ValueError, "percentile must be either in the range [0,100]" + + indexer = [slice(None)] * sorted.ndim + Nx = sorted.shape[axis] + index = q*(Nx-1) + i = int(index) + if i == index: + indexer[axis] = slice(i, i+1) + weights = array(1) + sumval = 1.0 + else: + indexer[axis] = slice(i, i+2) + j = i + 1 + weights = array([(j - index), (index - i)],float) + wshape = [1]*sorted.ndim + wshape[axis] = 2 + weights.shape = wshape + sumval = weights.sum() + + # Use add.reduce in both cases to coerce data type as well as + # check and use out array. + return add.reduce(sorted[indexer]*weights, axis=axis, out=out)/sumval _______________________________________________ relax (http://www.nmr-relax.com) This is the relax-commits mailing list relax-commits@gna.org To unsubscribe from this list, get a password reminder, or change your subscription options, visit the list information page at https://mail.gna.org/listinfo/relax-commits