123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- """
- Module of functions that are like ufuncs in acting on arrays and optionally
- storing results in an output array.
- """
- __all__ = ['fix', 'isneginf', 'isposinf']
- import numpy.core.numeric as nx
- from numpy.core.overrides import (
- array_function_dispatch, ARRAY_FUNCTION_ENABLED,
- )
- import warnings
- import functools
- def _deprecate_out_named_y(f):
- """
- Allow the out argument to be passed as the name `y` (deprecated)
- In future, this decorator should be removed.
- """
- @functools.wraps(f)
- def func(x, out=None, **kwargs):
- if 'y' in kwargs:
- if 'out' in kwargs:
- raise TypeError(
- "{} got multiple values for argument 'out'/'y'"
- .format(f.__name__)
- )
- out = kwargs.pop('y')
- # NumPy 1.13.0, 2017-04-26
- warnings.warn(
- "The name of the out argument to {} has changed from `y` to "
- "`out`, to match other ufuncs.".format(f.__name__),
- DeprecationWarning, stacklevel=3)
- return f(x, out=out, **kwargs)
- return func
- def _fix_out_named_y(f):
- """
- Allow the out argument to be passed as the name `y` (deprecated)
- This decorator should only be used if _deprecate_out_named_y is used on
- a corresponding dispatcher function.
- """
- @functools.wraps(f)
- def func(x, out=None, **kwargs):
- if 'y' in kwargs:
- # we already did error checking in _deprecate_out_named_y
- out = kwargs.pop('y')
- return f(x, out=out, **kwargs)
- return func
- def _fix_and_maybe_deprecate_out_named_y(f):
- """
- Use the appropriate decorator, depending upon if dispatching is being used.
- """
- if ARRAY_FUNCTION_ENABLED:
- return _fix_out_named_y(f)
- else:
- return _deprecate_out_named_y(f)
- @_deprecate_out_named_y
- def _dispatcher(x, out=None):
- return (x, out)
- @array_function_dispatch(_dispatcher, verify=False, module='numpy')
- @_fix_and_maybe_deprecate_out_named_y
- def fix(x, out=None):
- """
- Round to nearest integer towards zero.
- Round an array of floats element-wise to nearest integer towards zero.
- The rounded values are returned as floats.
- Parameters
- ----------
- x : array_like
- An array of floats to be rounded
- out : ndarray, optional
- A location into which the result is stored. If provided, it must have
- a shape that the input broadcasts to. If not provided or None, a
- freshly-allocated array is returned.
- Returns
- -------
- out : ndarray of floats
- A float array with the same dimensions as the input.
- If second argument is not supplied then a float array is returned
- with the rounded values.
- If a second argument is supplied the result is stored there.
- The return value `out` is then a reference to that array.
- See Also
- --------
- rint, trunc, floor, ceil
- around : Round to given number of decimals
- Examples
- --------
- >>> np.fix(3.14)
- 3.0
- >>> np.fix(3)
- 3.0
- >>> np.fix([2.1, 2.9, -2.1, -2.9])
- array([ 2., 2., -2., -2.])
- """
- # promote back to an array if flattened
- res = nx.asanyarray(nx.ceil(x, out=out))
- res = nx.floor(x, out=res, where=nx.greater_equal(x, 0))
- # when no out argument is passed and no subclasses are involved, flatten
- # scalars
- if out is None and type(res) is nx.ndarray:
- res = res[()]
- return res
- @array_function_dispatch(_dispatcher, verify=False, module='numpy')
- @_fix_and_maybe_deprecate_out_named_y
- def isposinf(x, out=None):
- """
- Test element-wise for positive infinity, return result as bool array.
- Parameters
- ----------
- x : array_like
- The input array.
- out : array_like, optional
- A location into which the result is stored. If provided, it must have a
- shape that the input broadcasts to. If not provided or None, a
- freshly-allocated boolean array is returned.
- Returns
- -------
- out : ndarray
- A boolean array with the same dimensions as the input.
- If second argument is not supplied then a boolean array is returned
- with values True where the corresponding element of the input is
- positive infinity and values False where the element of the input is
- not positive infinity.
- If a second argument is supplied the result is stored there. If the
- type of that array is a numeric type the result is represented as zeros
- and ones, if the type is boolean then as False and True.
- The return value `out` is then a reference to that array.
- See Also
- --------
- isinf, isneginf, isfinite, isnan
- Notes
- -----
- NumPy uses the IEEE Standard for Binary Floating-Point for Arithmetic
- (IEEE 754).
- Errors result if the second argument is also supplied when x is a scalar
- input, if first and second arguments have different shapes, or if the
- first argument has complex values
- Examples
- --------
- >>> np.isposinf(np.PINF)
- True
- >>> np.isposinf(np.inf)
- True
- >>> np.isposinf(np.NINF)
- False
- >>> np.isposinf([-np.inf, 0., np.inf])
- array([False, False, True])
- >>> x = np.array([-np.inf, 0., np.inf])
- >>> y = np.array([2, 2, 2])
- >>> np.isposinf(x, y)
- array([0, 0, 1])
- >>> y
- array([0, 0, 1])
- """
- is_inf = nx.isinf(x)
- try:
- signbit = ~nx.signbit(x)
- except TypeError as e:
- dtype = nx.asanyarray(x).dtype
- raise TypeError(f'This operation is not supported for {dtype} values '
- 'because it would be ambiguous.') from e
- else:
- return nx.logical_and(is_inf, signbit, out)
- @array_function_dispatch(_dispatcher, verify=False, module='numpy')
- @_fix_and_maybe_deprecate_out_named_y
- def isneginf(x, out=None):
- """
- Test element-wise for negative infinity, return result as bool array.
- Parameters
- ----------
- x : array_like
- The input array.
- out : array_like, optional
- A location into which the result is stored. If provided, it must have a
- shape that the input broadcasts to. If not provided or None, a
- freshly-allocated boolean array is returned.
- Returns
- -------
- out : ndarray
- A boolean array with the same dimensions as the input.
- If second argument is not supplied then a numpy boolean array is
- returned with values True where the corresponding element of the
- input is negative infinity and values False where the element of
- the input is not negative infinity.
- If a second argument is supplied the result is stored there. If the
- type of that array is a numeric type the result is represented as
- zeros and ones, if the type is boolean then as False and True. The
- return value `out` is then a reference to that array.
- See Also
- --------
- isinf, isposinf, isnan, isfinite
- Notes
- -----
- NumPy uses the IEEE Standard for Binary Floating-Point for Arithmetic
- (IEEE 754).
- Errors result if the second argument is also supplied when x is a scalar
- input, if first and second arguments have different shapes, or if the
- first argument has complex values.
- Examples
- --------
- >>> np.isneginf(np.NINF)
- True
- >>> np.isneginf(np.inf)
- False
- >>> np.isneginf(np.PINF)
- False
- >>> np.isneginf([-np.inf, 0., np.inf])
- array([ True, False, False])
- >>> x = np.array([-np.inf, 0., np.inf])
- >>> y = np.array([2, 2, 2])
- >>> np.isneginf(x, y)
- array([1, 0, 0])
- >>> y
- array([1, 0, 0])
- """
- is_inf = nx.isinf(x)
- try:
- signbit = nx.signbit(x)
- except TypeError as e:
- dtype = nx.asanyarray(x).dtype
- raise TypeError(f'This operation is not supported for {dtype} values '
- 'because it would be ambiguous.') from e
- else:
- return nx.logical_and(is_inf, signbit, out)
|