Source code for utilipy.math.core

# -*- coding: utf-8 -*-

"""Math Core Functions."""

__author__ = "Nathaniel Starkman"


__all__ = [
    "quadrature",
    # quantity functions
    "as_quantity",
    "qsquare",
    "qnorm",
    "qarange",
]


##############################################################################
# IMPORTS

# BUILT-IN
import typing as T
import warnings

# THIRD PARTY
import numpy as np
from astropy.units import Quantity
from numpy.linalg import norm

##############################################################################
# IMPORTS

_NUMPY_VERSION = [
    int(v) for i, v in enumerate(np.__version__.split(".")) if i < 3
]
if (_NUMPY_VERSION[0] <= 1) and (_NUMPY_VERSION[1] <= 16):  # v1.16
    warnings.warn(
        (
            "Need to set the environment variable "
            "NUMPY_EXPERIMENTAL_ARRAY_FUNCTION=1"
        )
    )


###############################################################################
# CODE
###############################################################################


[docs]def quadrature(*args: T.Tuple[T.Sequence], axis: int = 0) -> T.Sequence: """Return arguments summed in quadrature. :: sqrt(sum(square(args), axis=axis)) Parameters ---------- args: Sequence axis: int the summation axis, default 0. Returns ------- array-like """ if len(args) == 0: raise ValueError if len(args) == 1: args = args[0] return np.sqrt(np.sum(np.square(args), axis=axis))
# /def ##################################################################### # Quantity Functions
[docs]def as_quantity(arg): """Convert argument to a Quantity (or raise NotImplementedError). from :mod:`~astropy.utils`. Returns ------- Quantity not copied, quantity subclasses passed through. Raises ------ NotImplementedError if Quantity() fails """ try: return Quantity(arg, copy=False, subok=True) except Exception: raise NotImplementedError
# /def # -------------------------------------------------------------------
[docs]def qsquare(*args, **kw): """Quantity, Squared. Parameters ---------- *args : Quantity passed, as tuple, to :func:`~as_quantity` **kw arguments into :func:`~numpy.square` Returns ------- Quantity not copied, quantity subclasses passed through. Raises ------ NotImplementedError if :func:`~as_quantity` fails """ return np.square(as_quantity(args), **kw)
# /def # -------------------------------------------------------------------
[docs]def qnorm(*args, **kw): """Quantity, Normed. Parameters ---------- *args : Quantity passed, as tuple, to :func:`~as_quantity` **kw arguments into :func:`~numpy.linalg.norm` Returns ------- Quantity not copied, quantity subclasses passed through. Raises ------ NotImplementedError if :func:`~as_quantity` fails """ return norm(as_quantity(args), **kw)
# /def # -------------------------------------------------------------------
[docs]def qarange(start, stop, step, unit=None): """:func:`~numpy.arange` for Quantities.""" if unit is None: unit = step.unit arng = np.arange( start.to_value(unit), stop.to_value(unit), step.to_value(unit) ) return arng * unit
# /def # ------------------------------------------------------------------- ############################################################################### # END