1""" 
    2Create the numpy._core.multiarray namespace for backward compatibility. 
    3In v1.16 the multiarray and umath c-extension modules were merged into 
    4a single _multiarray_umath extension module. So we replicate the old 
    5namespace by importing from the extension module. 
    6 
    7""" 
    8 
    9import functools 
    10 
    11from . import _multiarray_umath, overrides 
    12from ._multiarray_umath import *  # noqa: F403 
    13 
    14# These imports are needed for backward compatibility, 
    15# do not change them. issue gh-15518 
    16# _get_ndarray_c_version is semi-public, on purpose not added to __all__ 
    17from ._multiarray_umath import (  # noqa: F401 
    18    _ARRAY_API, 
    19    _flagdict, 
    20    _get_madvise_hugepage, 
    21    _get_ndarray_c_version, 
    22    _monotonicity, 
    23    _place, 
    24    _reconstruct, 
    25    _set_madvise_hugepage, 
    26    _vec_string, 
    27    from_dlpack, 
    28) 
    29 
    30__all__ = [ 
    31    '_ARRAY_API', 'ALLOW_THREADS', 'BUFSIZE', 'CLIP', 'DATETIMEUNITS', 
    32    'ITEM_HASOBJECT', 'ITEM_IS_POINTER', 'LIST_PICKLE', 'MAXDIMS', 
    33    'MAY_SHARE_BOUNDS', 'MAY_SHARE_EXACT', 'NEEDS_INIT', 'NEEDS_PYAPI', 
    34    'RAISE', 'USE_GETITEM', 'USE_SETITEM', 'WRAP', 
    35    '_flagdict', 'from_dlpack', '_place', '_reconstruct', '_vec_string', 
    36    '_monotonicity', 'add_docstring', 'arange', 'array', 'asarray', 
    37    'asanyarray', 'ascontiguousarray', 'asfortranarray', 'bincount', 
    38    'broadcast', 'busday_count', 'busday_offset', 'busdaycalendar', 'can_cast', 
    39    'compare_chararrays', 'concatenate', 'copyto', 'correlate', 'correlate2', 
    40    'count_nonzero', 'c_einsum', 'datetime_as_string', 'datetime_data', 
    41    'dot', 'dragon4_positional', 'dragon4_scientific', 'dtype', 
    42    'empty', 'empty_like', 'error', 'flagsobj', 'flatiter', 'format_longfloat', 
    43    'frombuffer', 'fromfile', 'fromiter', 'fromstring', 
    44    'get_handler_name', 'get_handler_version', 'inner', 'interp', 
    45    'interp_complex', 'is_busday', 'lexsort', 'matmul', 'vecdot', 
    46    'may_share_memory', 'min_scalar_type', 'ndarray', 'nditer', 'nested_iters', 
    47    'normalize_axis_index', 'packbits', 'promote_types', 'putmask', 
    48    'ravel_multi_index', 'result_type', 'scalar', 'set_datetimeparse_function', 
    49    'set_typeDict', 'shares_memory', 'typeinfo', 
    50    'unpackbits', 'unravel_index', 'vdot', 'where', 'zeros'] 
    51 
    52# For backward compatibility, make sure pickle imports 
    53# these functions from here 
    54_reconstruct.__module__ = 'numpy._core.multiarray' 
    55scalar.__module__ = 'numpy._core.multiarray' 
    56 
    57 
    58from_dlpack.__module__ = 'numpy' 
    59arange.__module__ = 'numpy' 
    60array.__module__ = 'numpy' 
    61asarray.__module__ = 'numpy' 
    62asanyarray.__module__ = 'numpy' 
    63ascontiguousarray.__module__ = 'numpy' 
    64asfortranarray.__module__ = 'numpy' 
    65datetime_data.__module__ = 'numpy' 
    66empty.__module__ = 'numpy' 
    67frombuffer.__module__ = 'numpy' 
    68fromfile.__module__ = 'numpy' 
    69fromiter.__module__ = 'numpy' 
    70frompyfunc.__module__ = 'numpy' 
    71fromstring.__module__ = 'numpy' 
    72may_share_memory.__module__ = 'numpy' 
    73nested_iters.__module__ = 'numpy' 
    74promote_types.__module__ = 'numpy' 
    75zeros.__module__ = 'numpy' 
    76normalize_axis_index.__module__ = 'numpy.lib.array_utils' 
    77add_docstring.__module__ = 'numpy.lib' 
    78compare_chararrays.__module__ = 'numpy.char' 
    79 
    80 
    81def _override___module__(): 
    82    namespace_names = globals() 
    83    for ufunc_name in [ 
    84        'absolute', 'arccos', 'arccosh', 'add', 'arcsin', 'arcsinh', 'arctan', 
    85        'arctan2', 'arctanh', 'bitwise_and', 'bitwise_count', 'invert', 
    86        'left_shift', 'bitwise_or', 'right_shift', 'bitwise_xor', 'cbrt', 
    87        'ceil', 'conjugate', 'copysign', 'cos', 'cosh', 'deg2rad', 'degrees', 
    88        'divide', 'divmod', 'equal', 'exp', 'exp2', 'expm1', 'fabs', 
    89        'float_power', 'floor', 'floor_divide', 'fmax', 'fmin', 'fmod', 
    90        'frexp', 'gcd', 'greater', 'greater_equal', 'heaviside', 'hypot', 
    91        'isfinite', 'isinf', 'isnan', 'isnat', 'lcm', 'ldexp', 'less', 
    92        'less_equal', 'log', 'log10', 'log1p', 'log2', 'logaddexp', 
    93        'logaddexp2', 'logical_and', 'logical_not', 'logical_or', 
    94        'logical_xor', 'matmul', 'matvec', 'maximum', 'minimum', 'remainder', 
    95        'modf', 'multiply', 'negative', 'nextafter', 'not_equal', 'positive', 
    96        'power', 'rad2deg', 'radians', 'reciprocal', 'rint', 'sign', 'signbit', 
    97        'sin', 'sinh', 'spacing', 'sqrt', 'square', 'subtract', 'tan', 'tanh', 
    98        'trunc', 'vecdot', 'vecmat', 
    99    ]: 
    100        ufunc = namespace_names[ufunc_name] 
    101        ufunc.__module__ = "numpy" 
    102        ufunc.__qualname__ = ufunc_name 
    103 
    104 
    105_override___module__() 
    106 
    107 
    108# We can't verify dispatcher signatures because NumPy's C functions don't 
    109# support introspection. 
    110array_function_from_c_func_and_dispatcher = functools.partial( 
    111    overrides.array_function_from_dispatcher, 
    112    module='numpy', docs_from_dispatcher=True, verify=False) 
    113 
    114 
    115@array_function_from_c_func_and_dispatcher(_multiarray_umath.empty_like) 
    116def empty_like( 
    117    prototype, dtype=None, order=None, subok=None, shape=None, *, device=None 
    118): 
    119    """ 
    120    empty_like(prototype, dtype=None, order='K', subok=True, shape=None, *, 
    121               device=None) 
    122 
    123    Return a new array with the same shape and type as a given array. 
    124 
    125    Parameters 
    126    ---------- 
    127    prototype : array_like 
    128        The shape and data-type of `prototype` define these same attributes 
    129        of the returned array. 
    130    dtype : data-type, optional 
    131        Overrides the data type of the result. 
    132    order : {'C', 'F', 'A', or 'K'}, optional 
    133        Overrides the memory layout of the result. 'C' means C-order, 
    134        'F' means F-order, 'A' means 'F' if `prototype` is Fortran 
    135        contiguous, 'C' otherwise. 'K' means match the layout of `prototype` 
    136        as closely as possible. 
    137    subok : bool, optional. 
    138        If True, then the newly created array will use the sub-class 
    139        type of `prototype`, otherwise it will be a base-class array. Defaults 
    140        to True. 
    141    shape : int or sequence of ints, optional. 
    142        Overrides the shape of the result. If order='K' and the number of 
    143        dimensions is unchanged, will try to keep order, otherwise, 
    144        order='C' is implied. 
    145    device : str, optional 
    146        The device on which to place the created array. Default: None. 
    147        For Array-API interoperability only, so must be ``"cpu"`` if passed. 
    148 
    149        .. versionadded:: 2.0.0 
    150 
    151    Returns 
    152    ------- 
    153    out : ndarray 
    154        Array of uninitialized (arbitrary) data with the same 
    155        shape and type as `prototype`. 
    156 
    157    See Also 
    158    -------- 
    159    ones_like : Return an array of ones with shape and type of input. 
    160    zeros_like : Return an array of zeros with shape and type of input. 
    161    full_like : Return a new array with shape of input filled with value. 
    162    empty : Return a new uninitialized array. 
    163 
    164    Notes 
    165    ----- 
    166    Unlike other array creation functions (e.g. `zeros_like`, `ones_like`, 
    167    `full_like`), `empty_like` does not initialize the values of the array, 
    168    and may therefore be marginally faster. However, the values stored in the 
    169    newly allocated array are arbitrary. For reproducible behavior, be sure 
    170    to set each element of the array before reading. 
    171 
    172    Examples 
    173    -------- 
    174    >>> import numpy as np 
    175    >>> a = ([1,2,3], [4,5,6])                         # a is array-like 
    176    >>> np.empty_like(a) 
    177    array([[-1073741821, -1073741821,           3],    # uninitialized 
    178           [          0,           0, -1073741821]]) 
    179    >>> a = np.array([[1., 2., 3.],[4.,5.,6.]]) 
    180    >>> np.empty_like(a) 
    181    array([[ -2.00000715e+000,   1.48219694e-323,  -2.00000572e+000], # uninitialized 
    182           [  4.38791518e-305,  -2.00000715e+000,   4.17269252e-309]]) 
    183 
    184    """ 
    185    return (prototype,) 
    186 
    187 
    188@array_function_from_c_func_and_dispatcher(_multiarray_umath.concatenate) 
    189def concatenate(arrays, axis=None, out=None, *, dtype=None, casting=None): 
    190    """ 
    191    concatenate( 
    192        (a1, a2, ...), 
    193        axis=0, 
    194        out=None, 
    195        dtype=None, 
    196        casting="same_kind" 
    197    ) 
    198 
    199    Join a sequence of arrays along an existing axis. 
    200 
    201    Parameters 
    202    ---------- 
    203    a1, a2, ... : sequence of array_like 
    204        The arrays must have the same shape, except in the dimension 
    205        corresponding to `axis` (the first, by default). 
    206    axis : int, optional 
    207        The axis along which the arrays will be joined.  If axis is None, 
    208        arrays are flattened before use.  Default is 0. 
    209    out : ndarray, optional 
    210        If provided, the destination to place the result. The shape must be 
    211        correct, matching that of what concatenate would have returned if no 
    212        out argument were specified. 
    213    dtype : str or dtype 
    214        If provided, the destination array will have this dtype. Cannot be 
    215        provided together with `out`. 
    216 
    217        .. versionadded:: 1.20.0 
    218 
    219    casting : {'no', 'equiv', 'safe', 'same_kind', 'unsafe'}, optional 
    220        Controls what kind of data casting may occur. Defaults to 'same_kind'. 
    221        For a description of the options, please see :term:`casting`. 
    222 
    223        .. versionadded:: 1.20.0 
    224 
    225    Returns 
    226    ------- 
    227    res : ndarray 
    228        The concatenated array. 
    229 
    230    See Also 
    231    -------- 
    232    ma.concatenate : Concatenate function that preserves input masks. 
    233    array_split : Split an array into multiple sub-arrays of equal or 
    234                  near-equal size. 
    235    split : Split array into a list of multiple sub-arrays of equal size. 
    236    hsplit : Split array into multiple sub-arrays horizontally (column wise). 
    237    vsplit : Split array into multiple sub-arrays vertically (row wise). 
    238    dsplit : Split array into multiple sub-arrays along the 3rd axis (depth). 
    239    stack : Stack a sequence of arrays along a new axis. 
    240    block : Assemble arrays from blocks. 
    241    hstack : Stack arrays in sequence horizontally (column wise). 
    242    vstack : Stack arrays in sequence vertically (row wise). 
    243    dstack : Stack arrays in sequence depth wise (along third dimension). 
    244    column_stack : Stack 1-D arrays as columns into a 2-D array. 
    245 
    246    Notes 
    247    ----- 
    248    When one or more of the arrays to be concatenated is a MaskedArray, 
    249    this function will return a MaskedArray object instead of an ndarray, 
    250    but the input masks are *not* preserved. In cases where a MaskedArray 
    251    is expected as input, use the ma.concatenate function from the masked 
    252    array module instead. 
    253 
    254    Examples 
    255    -------- 
    256    >>> import numpy as np 
    257    >>> a = np.array([[1, 2], [3, 4]]) 
    258    >>> b = np.array([[5, 6]]) 
    259    >>> np.concatenate((a, b), axis=0) 
    260    array([[1, 2], 
    261           [3, 4], 
    262           [5, 6]]) 
    263    >>> np.concatenate((a, b.T), axis=1) 
    264    array([[1, 2, 5], 
    265           [3, 4, 6]]) 
    266    >>> np.concatenate((a, b), axis=None) 
    267    array([1, 2, 3, 4, 5, 6]) 
    268 
    269    This function will not preserve masking of MaskedArray inputs. 
    270 
    271    >>> a = np.ma.arange(3) 
    272    >>> a[1] = np.ma.masked 
    273    >>> b = np.arange(2, 5) 
    274    >>> a 
    275    masked_array(data=[0, --, 2], 
    276                 mask=[False,  True, False], 
    277           fill_value=999999) 
    278    >>> b 
    279    array([2, 3, 4]) 
    280    >>> np.concatenate([a, b]) 
    281    masked_array(data=[0, 1, 2, 2, 3, 4], 
    282                 mask=False, 
    283           fill_value=999999) 
    284    >>> np.ma.concatenate([a, b]) 
    285    masked_array(data=[0, --, 2, 2, 3, 4], 
    286                 mask=[False,  True, False, False, False, False], 
    287           fill_value=999999) 
    288 
    289    """ 
    290    if out is not None: 
    291        # optimize for the typical case where only arrays is provided 
    292        arrays = list(arrays) 
    293        arrays.append(out) 
    294    return arrays 
    295 
    296 
    297@array_function_from_c_func_and_dispatcher(_multiarray_umath.inner) 
    298def inner(a, b): 
    299    """ 
    300    inner(a, b, /) 
    301 
    302    Inner product of two arrays. 
    303 
    304    Ordinary inner product of vectors for 1-D arrays (without complex 
    305    conjugation), in higher dimensions a sum product over the last axes. 
    306 
    307    Parameters 
    308    ---------- 
    309    a, b : array_like 
    310        If `a` and `b` are nonscalar, their last dimensions must match. 
    311 
    312    Returns 
    313    ------- 
    314    out : ndarray 
    315        If `a` and `b` are both 
    316        scalars or both 1-D arrays then a scalar is returned; otherwise 
    317        an array is returned. 
    318        ``out.shape = (*a.shape[:-1], *b.shape[:-1])`` 
    319 
    320    Raises 
    321    ------ 
    322    ValueError 
    323        If both `a` and `b` are nonscalar and their last dimensions have 
    324        different sizes. 
    325 
    326    See Also 
    327    -------- 
    328    tensordot : Sum products over arbitrary axes. 
    329    dot : Generalised matrix product, using second last dimension of `b`. 
    330    vecdot : Vector dot product of two arrays. 
    331    einsum : Einstein summation convention. 
    332 
    333    Notes 
    334    ----- 
    335    For vectors (1-D arrays) it computes the ordinary inner-product:: 
    336 
    337        np.inner(a, b) = sum(a[:]*b[:]) 
    338 
    339    More generally, if ``ndim(a) = r > 0`` and ``ndim(b) = s > 0``:: 
    340 
    341        np.inner(a, b) = np.tensordot(a, b, axes=(-1,-1)) 
    342 
    343    or explicitly:: 
    344 
    345        np.inner(a, b)[i0,...,ir-2,j0,...,js-2] 
    346             = sum(a[i0,...,ir-2,:]*b[j0,...,js-2,:]) 
    347 
    348    In addition `a` or `b` may be scalars, in which case:: 
    349 
    350       np.inner(a,b) = a*b 
    351 
    352    Examples 
    353    -------- 
    354    Ordinary inner product for vectors: 
    355 
    356    >>> import numpy as np 
    357    >>> a = np.array([1,2,3]) 
    358    >>> b = np.array([0,1,0]) 
    359    >>> np.inner(a, b) 
    360    2 
    361 
    362    Some multidimensional examples: 
    363 
    364    >>> a = np.arange(24).reshape((2,3,4)) 
    365    >>> b = np.arange(4) 
    366    >>> c = np.inner(a, b) 
    367    >>> c.shape 
    368    (2, 3) 
    369    >>> c 
    370    array([[ 14,  38,  62], 
    371           [ 86, 110, 134]]) 
    372 
    373    >>> a = np.arange(2).reshape((1,1,2)) 
    374    >>> b = np.arange(6).reshape((3,2)) 
    375    >>> c = np.inner(a, b) 
    376    >>> c.shape 
    377    (1, 1, 3) 
    378    >>> c 
    379    array([[[1, 3, 5]]]) 
    380 
    381    An example where `b` is a scalar: 
    382 
    383    >>> np.inner(np.eye(2), 7) 
    384    array([[7., 0.], 
    385           [0., 7.]]) 
    386 
    387    """ 
    388    return (a, b) 
    389 
    390 
    391@array_function_from_c_func_and_dispatcher(_multiarray_umath.where) 
    392def where(condition, x=None, y=None): 
    393    """ 
    394    where(condition, [x, y], /) 
    395 
    396    Return elements chosen from `x` or `y` depending on `condition`. 
    397 
    398    .. note:: 
    399        When only `condition` is provided, this function is a shorthand for 
    400        ``np.asarray(condition).nonzero()``. Using `nonzero` directly should be 
    401        preferred, as it behaves correctly for subclasses. The rest of this 
    402        documentation covers only the case where all three arguments are 
    403        provided. 
    404 
    405    Parameters 
    406    ---------- 
    407    condition : array_like, bool 
    408        Where True, yield `x`, otherwise yield `y`. 
    409    x, y : array_like 
    410        Values from which to choose. `x`, `y` and `condition` need to be 
    411        broadcastable to some shape. 
    412 
    413    Returns 
    414    ------- 
    415    out : ndarray 
    416        An array with elements from `x` where `condition` is True, and elements 
    417        from `y` elsewhere. 
    418 
    419    See Also 
    420    -------- 
    421    choose 
    422    nonzero : The function that is called when x and y are omitted 
    423 
    424    Notes 
    425    ----- 
    426    If all the arrays are 1-D, `where` is equivalent to:: 
    427 
    428        [xv if c else yv 
    429         for c, xv, yv in zip(condition, x, y)] 
    430 
    431    Examples 
    432    -------- 
    433    >>> import numpy as np 
    434    >>> a = np.arange(10) 
    435    >>> a 
    436    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
    437    >>> np.where(a < 5, a, 10*a) 
    438    array([ 0,  1,  2,  3,  4, 50, 60, 70, 80, 90]) 
    439 
    440    This can be used on multidimensional arrays too: 
    441 
    442    >>> np.where([[True, False], [True, True]], 
    443    ...          [[1, 2], [3, 4]], 
    444    ...          [[9, 8], [7, 6]]) 
    445    array([[1, 8], 
    446           [3, 4]]) 
    447 
    448    The shapes of x, y, and the condition are broadcast together: 
    449 
    450    >>> x, y = np.ogrid[:3, :4] 
    451    >>> np.where(x < y, x, 10 + y)  # both x and 10+y are broadcast 
    452    array([[10,  0,  0,  0], 
    453           [10, 11,  1,  1], 
    454           [10, 11, 12,  2]]) 
    455 
    456    >>> a = np.array([[0, 1, 2], 
    457    ...               [0, 2, 4], 
    458    ...               [0, 3, 6]]) 
    459    >>> np.where(a < 4, a, -1)  # -1 is broadcast 
    460    array([[ 0,  1,  2], 
    461           [ 0,  2, -1], 
    462           [ 0,  3, -1]]) 
    463    """ 
    464    return (condition, x, y) 
    465 
    466 
    467@array_function_from_c_func_and_dispatcher(_multiarray_umath.lexsort) 
    468def lexsort(keys, axis=None): 
    469    """ 
    470    lexsort(keys, axis=-1) 
    471 
    472    Perform an indirect stable sort using a sequence of keys. 
    473 
    474    Given multiple sorting keys, lexsort returns an array of integer indices 
    475    that describes the sort order by multiple keys. The last key in the 
    476    sequence is used for the primary sort order, ties are broken by the 
    477    second-to-last key, and so on. 
    478 
    479    Parameters 
    480    ---------- 
    481    keys : (k, m, n, ...) array-like 
    482        The `k` keys to be sorted. The *last* key (e.g, the last 
    483        row if `keys` is a 2D array) is the primary sort key. 
    484        Each element of `keys` along the zeroth axis must be 
    485        an array-like object of the same shape. 
    486    axis : int, optional 
    487        Axis to be indirectly sorted. By default, sort over the last axis 
    488        of each sequence. Separate slices along `axis` sorted over 
    489        independently; see last example. 
    490 
    491    Returns 
    492    ------- 
    493    indices : (m, n, ...) ndarray of ints 
    494        Array of indices that sort the keys along the specified axis. 
    495 
    496    See Also 
    497    -------- 
    498    argsort : Indirect sort. 
    499    ndarray.sort : In-place sort. 
    500    sort : Return a sorted copy of an array. 
    501 
    502    Examples 
    503    -------- 
    504    Sort names: first by surname, then by name. 
    505 
    506    >>> import numpy as np 
    507    >>> surnames =    ('Hertz',    'Galilei', 'Hertz') 
    508    >>> first_names = ('Heinrich', 'Galileo', 'Gustav') 
    509    >>> ind = np.lexsort((first_names, surnames)) 
    510    >>> ind 
    511    array([1, 2, 0]) 
    512 
    513    >>> [surnames[i] + ", " + first_names[i] for i in ind] 
    514    ['Galilei, Galileo', 'Hertz, Gustav', 'Hertz, Heinrich'] 
    515 
    516    Sort according to two numerical keys, first by elements 
    517    of ``a``, then breaking ties according to elements of ``b``: 
    518 
    519    >>> a = [1, 5, 1, 4, 3, 4, 4]  # First sequence 
    520    >>> b = [9, 4, 0, 4, 0, 2, 1]  # Second sequence 
    521    >>> ind = np.lexsort((b, a))  # Sort by `a`, then by `b` 
    522    >>> ind 
    523    array([2, 0, 4, 6, 5, 3, 1]) 
    524    >>> [(a[i], b[i]) for i in ind] 
    525    [(1, 0), (1, 9), (3, 0), (4, 1), (4, 2), (4, 4), (5, 4)] 
    526 
    527    Compare against `argsort`, which would sort each key independently. 
    528 
    529    >>> np.argsort((b, a), kind='stable') 
    530    array([[2, 4, 6, 5, 1, 3, 0], 
    531           [0, 2, 4, 3, 5, 6, 1]]) 
    532 
    533    To sort lexicographically with `argsort`, we would need to provide a 
    534    structured array. 
    535 
    536    >>> x = np.array([(ai, bi) for ai, bi in zip(a, b)], 
    537    ...              dtype = np.dtype([('x', int), ('y', int)])) 
    538    >>> np.argsort(x)  # or np.argsort(x, order=('x', 'y')) 
    539    array([2, 0, 4, 6, 5, 3, 1]) 
    540 
    541    The zeroth axis of `keys` always corresponds with the sequence of keys, 
    542    so 2D arrays are treated just like other sequences of keys. 
    543 
    544    >>> arr = np.asarray([b, a]) 
    545    >>> ind2 = np.lexsort(arr) 
    546    >>> np.testing.assert_equal(ind2, ind) 
    547 
    548    Accordingly, the `axis` parameter refers to an axis of *each* key, not of 
    549    the `keys` argument itself. For instance, the array ``arr`` is treated as 
    550    a sequence of two 1-D keys, so specifying ``axis=0`` is equivalent to 
    551    using the default axis, ``axis=-1``. 
    552 
    553    >>> np.testing.assert_equal(np.lexsort(arr, axis=0), 
    554    ...                         np.lexsort(arr, axis=-1)) 
    555 
    556    For higher-dimensional arrays, the axis parameter begins to matter. The 
    557    resulting array has the same shape as each key, and the values are what 
    558    we would expect if `lexsort` were performed on corresponding slices 
    559    of the keys independently. For instance, 
    560 
    561    >>> x = [[1, 2, 3, 4], 
    562    ...      [4, 3, 2, 1], 
    563    ...      [2, 1, 4, 3]] 
    564    >>> y = [[2, 2, 1, 1], 
    565    ...      [1, 2, 1, 2], 
    566    ...      [1, 1, 2, 1]] 
    567    >>> np.lexsort((x, y), axis=1) 
    568    array([[2, 3, 0, 1], 
    569           [2, 0, 3, 1], 
    570           [1, 0, 3, 2]]) 
    571 
    572    Each row of the result is what we would expect if we were to perform 
    573    `lexsort` on the corresponding row of the keys: 
    574 
    575    >>> for i in range(3): 
    576    ...     print(np.lexsort((x[i], y[i]))) 
    577    [2 3 0 1] 
    578    [2 0 3 1] 
    579    [1 0 3 2] 
    580 
    581    """ 
    582    if isinstance(keys, tuple): 
    583        return keys 
    584    else: 
    585        return (keys,) 
    586 
    587 
    588@array_function_from_c_func_and_dispatcher(_multiarray_umath.can_cast) 
    589def can_cast(from_, to, casting=None): 
    590    """ 
    591    can_cast(from_, to, casting='safe') 
    592 
    593    Returns True if cast between data types can occur according to the 
    594    casting rule. 
    595 
    596    Parameters 
    597    ---------- 
    598    from_ : dtype, dtype specifier, NumPy scalar, or array 
    599        Data type, NumPy scalar, or array to cast from. 
    600    to : dtype or dtype specifier 
    601        Data type to cast to. 
    602    casting : {'no', 'equiv', 'safe', 'same_kind', 'unsafe'}, optional 
    603        Controls what kind of data casting may occur. 
    604 
    605        * 'no' means the data types should not be cast at all. 
    606        * 'equiv' means only byte-order changes are allowed. 
    607        * 'safe' means only casts which can preserve values are allowed. 
    608        * 'same_kind' means only safe casts or casts within a kind, 
    609          like float64 to float32, are allowed. 
    610        * 'unsafe' means any data conversions may be done. 
    611 
    612    Returns 
    613    ------- 
    614    out : bool 
    615        True if cast can occur according to the casting rule. 
    616 
    617    Notes 
    618    ----- 
    619    .. versionchanged:: 2.0 
    620       This function does not support Python scalars anymore and does not 
    621       apply any value-based logic for 0-D arrays and NumPy scalars. 
    622 
    623    See also 
    624    -------- 
    625    dtype, result_type 
    626 
    627    Examples 
    628    -------- 
    629    Basic examples 
    630 
    631    >>> import numpy as np 
    632    >>> np.can_cast(np.int32, np.int64) 
    633    True 
    634    >>> np.can_cast(np.float64, complex) 
    635    True 
    636    >>> np.can_cast(complex, float) 
    637    False 
    638 
    639    >>> np.can_cast('i8', 'f8') 
    640    True 
    641    >>> np.can_cast('i8', 'f4') 
    642    False 
    643    >>> np.can_cast('i4', 'S4') 
    644    False 
    645 
    646    """ 
    647    return (from_,) 
    648 
    649 
    650@array_function_from_c_func_and_dispatcher(_multiarray_umath.min_scalar_type) 
    651def min_scalar_type(a): 
    652    """ 
    653    min_scalar_type(a, /) 
    654 
    655    For scalar ``a``, returns the data type with the smallest size 
    656    and smallest scalar kind which can hold its value.  For non-scalar 
    657    array ``a``, returns the vector's dtype unmodified. 
    658 
    659    Floating point values are not demoted to integers, 
    660    and complex values are not demoted to floats. 
    661 
    662    Parameters 
    663    ---------- 
    664    a : scalar or array_like 
    665        The value whose minimal data type is to be found. 
    666 
    667    Returns 
    668    ------- 
    669    out : dtype 
    670        The minimal data type. 
    671 
    672    See Also 
    673    -------- 
    674    result_type, promote_types, dtype, can_cast 
    675 
    676    Examples 
    677    -------- 
    678    >>> import numpy as np 
    679    >>> np.min_scalar_type(10) 
    680    dtype('uint8') 
    681 
    682    >>> np.min_scalar_type(-260) 
    683    dtype('int16') 
    684 
    685    >>> np.min_scalar_type(3.1) 
    686    dtype('float16') 
    687 
    688    >>> np.min_scalar_type(1e50) 
    689    dtype('float64') 
    690 
    691    >>> np.min_scalar_type(np.arange(4,dtype='f8')) 
    692    dtype('float64') 
    693 
    694    """ 
    695    return (a,) 
    696 
    697 
    698@array_function_from_c_func_and_dispatcher(_multiarray_umath.result_type) 
    699def result_type(*arrays_and_dtypes): 
    700    """ 
    701    result_type(*arrays_and_dtypes) 
    702 
    703    Returns the type that results from applying the NumPy 
    704    type promotion rules to the arguments. 
    705 
    706    Type promotion in NumPy works similarly to the rules in languages 
    707    like C++, with some slight differences.  When both scalars and 
    708    arrays are used, the array's type takes precedence and the actual value 
    709    of the scalar is taken into account. 
    710 
    711    For example, calculating 3*a, where a is an array of 32-bit floats, 
    712    intuitively should result in a 32-bit float output.  If the 3 is a 
    713    32-bit integer, the NumPy rules indicate it can't convert losslessly 
    714    into a 32-bit float, so a 64-bit float should be the result type. 
    715    By examining the value of the constant, '3', we see that it fits in 
    716    an 8-bit integer, which can be cast losslessly into the 32-bit float. 
    717 
    718    Parameters 
    719    ---------- 
    720    arrays_and_dtypes : list of arrays and dtypes 
    721        The operands of some operation whose result type is needed. 
    722 
    723    Returns 
    724    ------- 
    725    out : dtype 
    726        The result type. 
    727 
    728    See also 
    729    -------- 
    730    dtype, promote_types, min_scalar_type, can_cast 
    731 
    732    Notes 
    733    ----- 
    734    The specific algorithm used is as follows. 
    735 
    736    Categories are determined by first checking which of boolean, 
    737    integer (int/uint), or floating point (float/complex) the maximum 
    738    kind of all the arrays and the scalars are. 
    739 
    740    If there are only scalars or the maximum category of the scalars 
    741    is higher than the maximum category of the arrays, 
    742    the data types are combined with :func:`promote_types` 
    743    to produce the return value. 
    744 
    745    Otherwise, `min_scalar_type` is called on each scalar, and 
    746    the resulting data types are all combined with :func:`promote_types` 
    747    to produce the return value. 
    748 
    749    The set of int values is not a subset of the uint values for types 
    750    with the same number of bits, something not reflected in 
    751    :func:`min_scalar_type`, but handled as a special case in `result_type`. 
    752 
    753    Examples 
    754    -------- 
    755    >>> import numpy as np 
    756    >>> np.result_type(3, np.arange(7, dtype='i1')) 
    757    dtype('int8') 
    758 
    759    >>> np.result_type('i4', 'c8') 
    760    dtype('complex128') 
    761 
    762    >>> np.result_type(3.0, -2) 
    763    dtype('float64') 
    764 
    765    """ 
    766    return arrays_and_dtypes 
    767 
    768 
    769@array_function_from_c_func_and_dispatcher(_multiarray_umath.dot) 
    770def dot(a, b, out=None): 
    771    """ 
    772    dot(a, b, out=None) 
    773 
    774    Dot product of two arrays. Specifically, 
    775 
    776    - If both `a` and `b` are 1-D arrays, it is inner product of vectors 
    777      (without complex conjugation). 
    778 
    779    - If both `a` and `b` are 2-D arrays, it is matrix multiplication, 
    780      but using :func:`matmul` or ``a @ b`` is preferred. 
    781 
    782    - If either `a` or `b` is 0-D (scalar), it is equivalent to 
    783      :func:`multiply` and using ``numpy.multiply(a, b)`` or ``a * b`` is 
    784      preferred. 
    785 
    786    - If `a` is an N-D array and `b` is a 1-D array, it is a sum product over 
    787      the last axis of `a` and `b`. 
    788 
    789    - If `a` is an N-D array and `b` is an M-D array (where ``M>=2``), it is a 
    790      sum product over the last axis of `a` and the second-to-last axis of 
    791      `b`:: 
    792 
    793        dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m]) 
    794 
    795    It uses an optimized BLAS library when possible (see `numpy.linalg`). 
    796 
    797    Parameters 
    798    ---------- 
    799    a : array_like 
    800        First argument. 
    801    b : array_like 
    802        Second argument. 
    803    out : ndarray, optional 
    804        Output argument. This must have the exact kind that would be returned 
    805        if it was not used. In particular, it must have the right type, must be 
    806        C-contiguous, and its dtype must be the dtype that would be returned 
    807        for `dot(a,b)`. This is a performance feature. Therefore, if these 
    808        conditions are not met, an exception is raised, instead of attempting 
    809        to be flexible. 
    810 
    811    Returns 
    812    ------- 
    813    output : ndarray 
    814        Returns the dot product of `a` and `b`.  If `a` and `b` are both 
    815        scalars or both 1-D arrays then a scalar is returned; otherwise 
    816        an array is returned. 
    817        If `out` is given, then it is returned. 
    818 
    819    Raises 
    820    ------ 
    821    ValueError 
    822        If the last dimension of `a` is not the same size as 
    823        the second-to-last dimension of `b`. 
    824 
    825    See Also 
    826    -------- 
    827    vdot : Complex-conjugating dot product. 
    828    vecdot : Vector dot product of two arrays. 
    829    tensordot : Sum products over arbitrary axes. 
    830    einsum : Einstein summation convention. 
    831    matmul : '@' operator as method with out parameter. 
    832    linalg.multi_dot : Chained dot product. 
    833 
    834    Examples 
    835    -------- 
    836    >>> import numpy as np 
    837    >>> np.dot(3, 4) 
    838    12 
    839 
    840    Neither argument is complex-conjugated: 
    841 
    842    >>> np.dot([2j, 3j], [2j, 3j]) 
    843    (-13+0j) 
    844 
    845    For 2-D arrays it is the matrix product: 
    846 
    847    >>> a = [[1, 0], [0, 1]] 
    848    >>> b = [[4, 1], [2, 2]] 
    849    >>> np.dot(a, b) 
    850    array([[4, 1], 
    851           [2, 2]]) 
    852 
    853    >>> a = np.arange(3*4*5*6).reshape((3,4,5,6)) 
    854    >>> b = np.arange(3*4*5*6)[::-1].reshape((5,4,6,3)) 
    855    >>> np.dot(a, b)[2,3,2,1,2,2] 
    856    499128 
    857    >>> sum(a[2,3,2,:] * b[1,2,:,2]) 
    858    499128 
    859 
    860    """ 
    861    return (a, b, out) 
    862 
    863 
    864@array_function_from_c_func_and_dispatcher(_multiarray_umath.vdot) 
    865def vdot(a, b): 
    866    r""" 
    867    vdot(a, b, /) 
    868 
    869    Return the dot product of two vectors. 
    870 
    871    The `vdot` function handles complex numbers differently than `dot`: 
    872    if the first argument is complex, it is replaced by its complex conjugate 
    873    in the dot product calculation. `vdot` also handles multidimensional 
    874    arrays differently than `dot`: it does not perform a matrix product, but 
    875    flattens the arguments to 1-D arrays before taking a vector dot product. 
    876 
    877    Consequently, when the arguments are 2-D arrays of the same shape, this 
    878    function effectively returns their 
    879    `Frobenius inner product <https://en.wikipedia.org/wiki/Frobenius_inner_product>`_ 
    880    (also known as the *trace inner product* or the *standard inner product* 
    881    on a vector space of matrices). 
    882 
    883    Parameters 
    884    ---------- 
    885    a : array_like 
    886        If `a` is complex the complex conjugate is taken before calculation 
    887        of the dot product. 
    888    b : array_like 
    889        Second argument to the dot product. 
    890 
    891    Returns 
    892    ------- 
    893    output : ndarray 
    894        Dot product of `a` and `b`.  Can be an int, float, or 
    895        complex depending on the types of `a` and `b`. 
    896 
    897    See Also 
    898    -------- 
    899    dot : Return the dot product without using the complex conjugate of the 
    900          first argument. 
    901 
    902    Examples 
    903    -------- 
    904    >>> import numpy as np 
    905    >>> a = np.array([1+2j,3+4j]) 
    906    >>> b = np.array([5+6j,7+8j]) 
    907    >>> np.vdot(a, b) 
    908    (70-8j) 
    909    >>> np.vdot(b, a) 
    910    (70+8j) 
    911 
    912    Note that higher-dimensional arrays are flattened! 
    913 
    914    >>> a = np.array([[1, 4], [5, 6]]) 
    915    >>> b = np.array([[4, 1], [2, 2]]) 
    916    >>> np.vdot(a, b) 
    917    30 
    918    >>> np.vdot(b, a) 
    919    30 
    920    >>> 1*4 + 4*1 + 5*2 + 6*2 
    921    30 
    922 
    923    """  # noqa: E501 
    924    return (a, b) 
    925 
    926 
    927@array_function_from_c_func_and_dispatcher(_multiarray_umath.bincount) 
    928def bincount(x, weights=None, minlength=None): 
    929    """ 
    930    bincount(x, /, weights=None, minlength=0) 
    931 
    932    Count number of occurrences of each value in array of non-negative ints. 
    933 
    934    The number of bins (of size 1) is one larger than the largest value in 
    935    `x`. If `minlength` is specified, there will be at least this number 
    936    of bins in the output array (though it will be longer if necessary, 
    937    depending on the contents of `x`). 
    938    Each bin gives the number of occurrences of its index value in `x`. 
    939    If `weights` is specified the input array is weighted by it, i.e. if a 
    940    value ``n`` is found at position ``i``, ``out[n] += weight[i]`` instead 
    941    of ``out[n] += 1``. 
    942 
    943    Parameters 
    944    ---------- 
    945    x : array_like, 1 dimension, nonnegative ints 
    946        Input array. 
    947    weights : array_like, optional 
    948        Weights, array of the same shape as `x`. 
    949    minlength : int, optional 
    950        A minimum number of bins for the output array. 
    951 
    952    Returns 
    953    ------- 
    954    out : ndarray of ints 
    955        The result of binning the input array. 
    956        The length of `out` is equal to ``np.amax(x)+1``. 
    957 
    958    Raises 
    959    ------ 
    960    ValueError 
    961        If the input is not 1-dimensional, or contains elements with negative 
    962        values, or if `minlength` is negative. 
    963    TypeError 
    964        If the type of the input is float or complex. 
    965 
    966    See Also 
    967    -------- 
    968    histogram, digitize, unique 
    969 
    970    Examples 
    971    -------- 
    972    >>> import numpy as np 
    973    >>> np.bincount(np.arange(5)) 
    974    array([1, 1, 1, 1, 1]) 
    975    >>> np.bincount(np.array([0, 1, 1, 3, 2, 1, 7])) 
    976    array([1, 3, 1, 1, 0, 0, 0, 1]) 
    977 
    978    >>> x = np.array([0, 1, 1, 3, 2, 1, 7, 23]) 
    979    >>> np.bincount(x).size == np.amax(x)+1 
    980    True 
    981 
    982    The input array needs to be of integer dtype, otherwise a 
    983    TypeError is raised: 
    984 
    985    >>> np.bincount(np.arange(5, dtype=float)) 
    986    Traceback (most recent call last): 
    987      ... 
    988    TypeError: Cannot cast array data from dtype('float64') to dtype('int64') 
    989    according to the rule 'safe' 
    990 
    991    A possible use of ``bincount`` is to perform sums over 
    992    variable-size chunks of an array, using the ``weights`` keyword. 
    993 
    994    >>> w = np.array([0.3, 0.5, 0.2, 0.7, 1., -0.6]) # weights 
    995    >>> x = np.array([0, 1, 1, 2, 2, 2]) 
    996    >>> np.bincount(x,  weights=w) 
    997    array([ 0.3,  0.7,  1.1]) 
    998 
    999    """ 
    1000    return (x, weights) 
    1001 
    1002 
    1003@array_function_from_c_func_and_dispatcher(_multiarray_umath.ravel_multi_index) 
    1004def ravel_multi_index(multi_index, dims, mode=None, order=None): 
    1005    """ 
    1006    ravel_multi_index(multi_index, dims, mode='raise', order='C') 
    1007 
    1008    Converts a tuple of index arrays into an array of flat 
    1009    indices, applying boundary modes to the multi-index. 
    1010 
    1011    Parameters 
    1012    ---------- 
    1013    multi_index : tuple of array_like 
    1014        A tuple of integer arrays, one array for each dimension. 
    1015    dims : tuple of ints 
    1016        The shape of array into which the indices from ``multi_index`` apply. 
    1017    mode : {'raise', 'wrap', 'clip'}, optional 
    1018        Specifies how out-of-bounds indices are handled.  Can specify 
    1019        either one mode or a tuple of modes, one mode per index. 
    1020 
    1021        * 'raise' -- raise an error (default) 
    1022        * 'wrap' -- wrap around 
    1023        * 'clip' -- clip to the range 
    1024 
    1025        In 'clip' mode, a negative index which would normally 
    1026        wrap will clip to 0 instead. 
    1027    order : {'C', 'F'}, optional 
    1028        Determines whether the multi-index should be viewed as 
    1029        indexing in row-major (C-style) or column-major 
    1030        (Fortran-style) order. 
    1031 
    1032    Returns 
    1033    ------- 
    1034    raveled_indices : ndarray 
    1035        An array of indices into the flattened version of an array 
    1036        of dimensions ``dims``. 
    1037 
    1038    See Also 
    1039    -------- 
    1040    unravel_index 
    1041 
    1042    Examples 
    1043    -------- 
    1044    >>> import numpy as np 
    1045    >>> arr = np.array([[3,6,6],[4,5,1]]) 
    1046    >>> np.ravel_multi_index(arr, (7,6)) 
    1047    array([22, 41, 37]) 
    1048    >>> np.ravel_multi_index(arr, (7,6), order='F') 
    1049    array([31, 41, 13]) 
    1050    >>> np.ravel_multi_index(arr, (4,6), mode='clip') 
    1051    array([22, 23, 19]) 
    1052    >>> np.ravel_multi_index(arr, (4,4), mode=('clip','wrap')) 
    1053    array([12, 13, 13]) 
    1054 
    1055    >>> np.ravel_multi_index((3,1,4,1), (6,7,8,9)) 
    1056    1621 
    1057    """ 
    1058    return multi_index 
    1059 
    1060 
    1061@array_function_from_c_func_and_dispatcher(_multiarray_umath.unravel_index) 
    1062def unravel_index(indices, shape=None, order=None): 
    1063    """ 
    1064    unravel_index(indices, shape, order='C') 
    1065 
    1066    Converts a flat index or array of flat indices into a tuple 
    1067    of coordinate arrays. 
    1068 
    1069    Parameters 
    1070    ---------- 
    1071    indices : array_like 
    1072        An integer array whose elements are indices into the flattened 
    1073        version of an array of dimensions ``shape``. Before version 1.6.0, 
    1074        this function accepted just one index value. 
    1075    shape : tuple of ints 
    1076        The shape of the array to use for unraveling ``indices``. 
    1077    order : {'C', 'F'}, optional 
    1078        Determines whether the indices should be viewed as indexing in 
    1079        row-major (C-style) or column-major (Fortran-style) order. 
    1080 
    1081    Returns 
    1082    ------- 
    1083    unraveled_coords : tuple of ndarray 
    1084        Each array in the tuple has the same shape as the ``indices`` 
    1085        array. 
    1086 
    1087    See Also 
    1088    -------- 
    1089    ravel_multi_index 
    1090 
    1091    Examples 
    1092    -------- 
    1093    >>> import numpy as np 
    1094    >>> np.unravel_index([22, 41, 37], (7,6)) 
    1095    (array([3, 6, 6]), array([4, 5, 1])) 
    1096    >>> np.unravel_index([31, 41, 13], (7,6), order='F') 
    1097    (array([3, 6, 6]), array([4, 5, 1])) 
    1098 
    1099    >>> np.unravel_index(1621, (6,7,8,9)) 
    1100    (3, 1, 4, 1) 
    1101 
    1102    """ 
    1103    return (indices,) 
    1104 
    1105 
    1106@array_function_from_c_func_and_dispatcher(_multiarray_umath.copyto) 
    1107def copyto(dst, src, casting=None, where=None): 
    1108    """ 
    1109    copyto(dst, src, casting='same_kind', where=True) 
    1110 
    1111    Copies values from one array to another, broadcasting as necessary. 
    1112 
    1113    Raises a TypeError if the `casting` rule is violated, and if 
    1114    `where` is provided, it selects which elements to copy. 
    1115 
    1116    Parameters 
    1117    ---------- 
    1118    dst : ndarray 
    1119        The array into which values are copied. 
    1120    src : array_like 
    1121        The array from which values are copied. 
    1122    casting : {'no', 'equiv', 'safe', 'same_kind', 'unsafe'}, optional 
    1123        Controls what kind of data casting may occur when copying. 
    1124 
    1125        * 'no' means the data types should not be cast at all. 
    1126        * 'equiv' means only byte-order changes are allowed. 
    1127        * 'safe' means only casts which can preserve values are allowed. 
    1128        * 'same_kind' means only safe casts or casts within a kind, 
    1129          like float64 to float32, are allowed. 
    1130        * 'unsafe' means any data conversions may be done. 
    1131    where : array_like of bool, optional 
    1132        A boolean array which is broadcasted to match the dimensions 
    1133        of `dst`, and selects elements to copy from `src` to `dst` 
    1134        wherever it contains the value True. 
    1135 
    1136    Examples 
    1137    -------- 
    1138    >>> import numpy as np 
    1139    >>> A = np.array([4, 5, 6]) 
    1140    >>> B = [1, 2, 3] 
    1141    >>> np.copyto(A, B) 
    1142    >>> A 
    1143    array([1, 2, 3]) 
    1144 
    1145    >>> A = np.array([[1, 2, 3], [4, 5, 6]]) 
    1146    >>> B = [[4, 5, 6], [7, 8, 9]] 
    1147    >>> np.copyto(A, B) 
    1148    >>> A 
    1149    array([[4, 5, 6], 
    1150           [7, 8, 9]]) 
    1151 
    1152    """ 
    1153    return (dst, src, where) 
    1154 
    1155 
    1156@array_function_from_c_func_and_dispatcher(_multiarray_umath.putmask) 
    1157def putmask(a, /, mask, values): 
    1158    """ 
    1159    putmask(a, mask, values) 
    1160 
    1161    Changes elements of an array based on conditional and input values. 
    1162 
    1163    Sets ``a.flat[n] = values[n]`` for each n where ``mask.flat[n]==True``. 
    1164 
    1165    If `values` is not the same size as `a` and `mask` then it will repeat. 
    1166    This gives behavior different from ``a[mask] = values``. 
    1167 
    1168    Parameters 
    1169    ---------- 
    1170    a : ndarray 
    1171        Target array. 
    1172    mask : array_like 
    1173        Boolean mask array. It has to be the same shape as `a`. 
    1174    values : array_like 
    1175        Values to put into `a` where `mask` is True. If `values` is smaller 
    1176        than `a` it will be repeated. 
    1177 
    1178    See Also 
    1179    -------- 
    1180    place, put, take, copyto 
    1181 
    1182    Examples 
    1183    -------- 
    1184    >>> import numpy as np 
    1185    >>> x = np.arange(6).reshape(2, 3) 
    1186    >>> np.putmask(x, x>2, x**2) 
    1187    >>> x 
    1188    array([[ 0,  1,  2], 
    1189           [ 9, 16, 25]]) 
    1190 
    1191    If `values` is smaller than `a` it is repeated: 
    1192 
    1193    >>> x = np.arange(5) 
    1194    >>> np.putmask(x, x>1, [-33, -44]) 
    1195    >>> x 
    1196    array([  0,   1, -33, -44, -33]) 
    1197 
    1198    """ 
    1199    return (a, mask, values) 
    1200 
    1201 
    1202@array_function_from_c_func_and_dispatcher(_multiarray_umath.packbits) 
    1203def packbits(a, axis=None, bitorder='big'): 
    1204    """ 
    1205    packbits(a, /, axis=None, bitorder='big') 
    1206 
    1207    Packs the elements of a binary-valued array into bits in a uint8 array. 
    1208 
    1209    The result is padded to full bytes by inserting zero bits at the end. 
    1210 
    1211    Parameters 
    1212    ---------- 
    1213    a : array_like 
    1214        An array of integers or booleans whose elements should be packed to 
    1215        bits. 
    1216    axis : int, optional 
    1217        The dimension over which bit-packing is done. 
    1218        ``None`` implies packing the flattened array. 
    1219    bitorder : {'big', 'little'}, optional 
    1220        The order of the input bits. 'big' will mimic bin(val), 
    1221        ``[0, 0, 0, 0, 0, 0, 1, 1] => 3 = 0b00000011``, 'little' will 
    1222        reverse the order so ``[1, 1, 0, 0, 0, 0, 0, 0] => 3``. 
    1223        Defaults to 'big'. 
    1224 
    1225    Returns 
    1226    ------- 
    1227    packed : ndarray 
    1228        Array of type uint8 whose elements represent bits corresponding to the 
    1229        logical (0 or nonzero) value of the input elements. The shape of 
    1230        `packed` has the same number of dimensions as the input (unless `axis` 
    1231        is None, in which case the output is 1-D). 
    1232 
    1233    See Also 
    1234    -------- 
    1235    unpackbits: Unpacks elements of a uint8 array into a binary-valued output 
    1236                array. 
    1237 
    1238    Examples 
    1239    -------- 
    1240    >>> import numpy as np 
    1241    >>> a = np.array([[[1,0,1], 
    1242    ...                [0,1,0]], 
    1243    ...               [[1,1,0], 
    1244    ...                [0,0,1]]]) 
    1245    >>> b = np.packbits(a, axis=-1) 
    1246    >>> b 
    1247    array([[[160], 
    1248            [ 64]], 
    1249           [[192], 
    1250            [ 32]]], dtype=uint8) 
    1251 
    1252    Note that in binary 160 = 1010 0000, 64 = 0100 0000, 192 = 1100 0000, 
    1253    and 32 = 0010 0000. 
    1254 
    1255    """ 
    1256    return (a,) 
    1257 
    1258 
    1259@array_function_from_c_func_and_dispatcher(_multiarray_umath.unpackbits) 
    1260def unpackbits(a, axis=None, count=None, bitorder='big'): 
    1261    """ 
    1262    unpackbits(a, /, axis=None, count=None, bitorder='big') 
    1263 
    1264    Unpacks elements of a uint8 array into a binary-valued output array. 
    1265 
    1266    Each element of `a` represents a bit-field that should be unpacked 
    1267    into a binary-valued output array. The shape of the output array is 
    1268    either 1-D (if `axis` is ``None``) or the same shape as the input 
    1269    array with unpacking done along the axis specified. 
    1270 
    1271    Parameters 
    1272    ---------- 
    1273    a : ndarray, uint8 type 
    1274       Input array. 
    1275    axis : int, optional 
    1276        The dimension over which bit-unpacking is done. 
    1277        ``None`` implies unpacking the flattened array. 
    1278    count : int or None, optional 
    1279        The number of elements to unpack along `axis`, provided as a way 
    1280        of undoing the effect of packing a size that is not a multiple 
    1281        of eight. A non-negative number means to only unpack `count` 
    1282        bits. A negative number means to trim off that many bits from 
    1283        the end. ``None`` means to unpack the entire array (the 
    1284        default). Counts larger than the available number of bits will 
    1285        add zero padding to the output. Negative counts must not 
    1286        exceed the available number of bits. 
    1287    bitorder : {'big', 'little'}, optional 
    1288        The order of the returned bits. 'big' will mimic bin(val), 
    1289        ``3 = 0b00000011 => [0, 0, 0, 0, 0, 0, 1, 1]``, 'little' will reverse 
    1290        the order to ``[1, 1, 0, 0, 0, 0, 0, 0]``. 
    1291        Defaults to 'big'. 
    1292 
    1293    Returns 
    1294    ------- 
    1295    unpacked : ndarray, uint8 type 
    1296       The elements are binary-valued (0 or 1). 
    1297 
    1298    See Also 
    1299    -------- 
    1300    packbits : Packs the elements of a binary-valued array into bits in 
    1301               a uint8 array. 
    1302 
    1303    Examples 
    1304    -------- 
    1305    >>> import numpy as np 
    1306    >>> a = np.array([[2], [7], [23]], dtype=np.uint8) 
    1307    >>> a 
    1308    array([[ 2], 
    1309           [ 7], 
    1310           [23]], dtype=uint8) 
    1311    >>> b = np.unpackbits(a, axis=1) 
    1312    >>> b 
    1313    array([[0, 0, 0, 0, 0, 0, 1, 0], 
    1314           [0, 0, 0, 0, 0, 1, 1, 1], 
    1315           [0, 0, 0, 1, 0, 1, 1, 1]], dtype=uint8) 
    1316    >>> c = np.unpackbits(a, axis=1, count=-3) 
    1317    >>> c 
    1318    array([[0, 0, 0, 0, 0], 
    1319           [0, 0, 0, 0, 0], 
    1320           [0, 0, 0, 1, 0]], dtype=uint8) 
    1321 
    1322    >>> p = np.packbits(b, axis=0) 
    1323    >>> np.unpackbits(p, axis=0) 
    1324    array([[0, 0, 0, 0, 0, 0, 1, 0], 
    1325           [0, 0, 0, 0, 0, 1, 1, 1], 
    1326           [0, 0, 0, 1, 0, 1, 1, 1], 
    1327           [0, 0, 0, 0, 0, 0, 0, 0], 
    1328           [0, 0, 0, 0, 0, 0, 0, 0], 
    1329           [0, 0, 0, 0, 0, 0, 0, 0], 
    1330           [0, 0, 0, 0, 0, 0, 0, 0], 
    1331           [0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8) 
    1332    >>> np.array_equal(b, np.unpackbits(p, axis=0, count=b.shape[0])) 
    1333    True 
    1334 
    1335    """ 
    1336    return (a,) 
    1337 
    1338 
    1339@array_function_from_c_func_and_dispatcher(_multiarray_umath.shares_memory) 
    1340def shares_memory(a, b, max_work=None): 
    1341    """ 
    1342    shares_memory(a, b, /, max_work=None) 
    1343 
    1344    Determine if two arrays share memory. 
    1345 
    1346    .. warning:: 
    1347 
    1348       This function can be exponentially slow for some inputs, unless 
    1349       `max_work` is set to zero or a positive integer. 
    1350       If in doubt, use `numpy.may_share_memory` instead. 
    1351 
    1352    Parameters 
    1353    ---------- 
    1354    a, b : ndarray 
    1355        Input arrays 
    1356    max_work : int, optional 
    1357        Effort to spend on solving the overlap problem (maximum number 
    1358        of candidate solutions to consider). The following special 
    1359        values are recognized: 
    1360 
    1361        max_work=-1 (default) 
    1362            The problem is solved exactly. In this case, the function returns 
    1363            True only if there is an element shared between the arrays. Finding 
    1364            the exact solution may take extremely long in some cases. 
    1365        max_work=0 
    1366            Only the memory bounds of a and b are checked. 
    1367            This is equivalent to using ``may_share_memory()``. 
    1368 
    1369    Raises 
    1370    ------ 
    1371    numpy.exceptions.TooHardError 
    1372        Exceeded max_work. 
    1373 
    1374    Returns 
    1375    ------- 
    1376    out : bool 
    1377 
    1378    See Also 
    1379    -------- 
    1380    may_share_memory 
    1381 
    1382    Examples 
    1383    -------- 
    1384    >>> import numpy as np 
    1385    >>> x = np.array([1, 2, 3, 4]) 
    1386    >>> np.shares_memory(x, np.array([5, 6, 7])) 
    1387    False 
    1388    >>> np.shares_memory(x[::2], x) 
    1389    True 
    1390    >>> np.shares_memory(x[::2], x[1::2]) 
    1391    False 
    1392 
    1393    Checking whether two arrays share memory is NP-complete, and 
    1394    runtime may increase exponentially in the number of 
    1395    dimensions. Hence, `max_work` should generally be set to a finite 
    1396    number, as it is possible to construct examples that take 
    1397    extremely long to run: 
    1398 
    1399    >>> from numpy.lib.stride_tricks import as_strided 
    1400    >>> x = np.zeros([192163377], dtype=np.int8) 
    1401    >>> x1 = as_strided( 
    1402    ...     x, strides=(36674, 61119, 85569), shape=(1049, 1049, 1049)) 
    1403    >>> x2 = as_strided( 
    1404    ...     x[64023025:], strides=(12223, 12224, 1), shape=(1049, 1049, 1)) 
    1405    >>> np.shares_memory(x1, x2, max_work=1000) 
    1406    Traceback (most recent call last): 
    1407    ... 
    1408    numpy.exceptions.TooHardError: Exceeded max_work 
    1409 
    1410    Running ``np.shares_memory(x1, x2)`` without `max_work` set takes 
    1411    around 1 minute for this case. It is possible to find problems 
    1412    that take still significantly longer. 
    1413 
    1414    """ 
    1415    return (a, b) 
    1416 
    1417 
    1418@array_function_from_c_func_and_dispatcher(_multiarray_umath.may_share_memory) 
    1419def may_share_memory(a, b, max_work=None): 
    1420    """ 
    1421    may_share_memory(a, b, /, max_work=None) 
    1422 
    1423    Determine if two arrays might share memory 
    1424 
    1425    A return of True does not necessarily mean that the two arrays 
    1426    share any element.  It just means that they *might*. 
    1427 
    1428    Only the memory bounds of a and b are checked by default. 
    1429 
    1430    Parameters 
    1431    ---------- 
    1432    a, b : ndarray 
    1433        Input arrays 
    1434    max_work : int, optional 
    1435        Effort to spend on solving the overlap problem.  See 
    1436        `shares_memory` for details.  Default for ``may_share_memory`` 
    1437        is to do a bounds check. 
    1438 
    1439    Returns 
    1440    ------- 
    1441    out : bool 
    1442 
    1443    See Also 
    1444    -------- 
    1445    shares_memory 
    1446 
    1447    Examples 
    1448    -------- 
    1449    >>> import numpy as np 
    1450    >>> np.may_share_memory(np.array([1,2]), np.array([5,8,9])) 
    1451    False 
    1452    >>> x = np.zeros([3, 4]) 
    1453    >>> np.may_share_memory(x[:,0], x[:,1]) 
    1454    True 
    1455 
    1456    """ 
    1457    return (a, b) 
    1458 
    1459 
    1460@array_function_from_c_func_and_dispatcher(_multiarray_umath.is_busday) 
    1461def is_busday(dates, weekmask=None, holidays=None, busdaycal=None, out=None): 
    1462    """ 
    1463    is_busday( 
    1464        dates, 
    1465        weekmask='1111100', 
    1466        holidays=None, 
    1467        busdaycal=None, 
    1468        out=None 
    1469    ) 
    1470 
    1471    Calculates which of the given dates are valid days, and which are not. 
    1472 
    1473    Parameters 
    1474    ---------- 
    1475    dates : array_like of datetime64[D] 
    1476        The array of dates to process. 
    1477    weekmask : str or array_like of bool, optional 
    1478        A seven-element array indicating which of Monday through Sunday are 
    1479        valid days. May be specified as a length-seven list or array, like 
    1480        [1,1,1,1,1,0,0]; a length-seven string, like '1111100'; or a string 
    1481        like "Mon Tue Wed Thu Fri", made up of 3-character abbreviations for 
    1482        weekdays, optionally separated by white space. Valid abbreviations 
    1483        are: Mon Tue Wed Thu Fri Sat Sun 
    1484    holidays : array_like of datetime64[D], optional 
    1485        An array of dates to consider as invalid dates.  They may be 
    1486        specified in any order, and NaT (not-a-time) dates are ignored. 
    1487        This list is saved in a normalized form that is suited for 
    1488        fast calculations of valid days. 
    1489    busdaycal : busdaycalendar, optional 
    1490        A `busdaycalendar` object which specifies the valid days. If this 
    1491        parameter is provided, neither weekmask nor holidays may be 
    1492        provided. 
    1493    out : array of bool, optional 
    1494        If provided, this array is filled with the result. 
    1495 
    1496    Returns 
    1497    ------- 
    1498    out : array of bool 
    1499        An array with the same shape as ``dates``, containing True for 
    1500        each valid day, and False for each invalid day. 
    1501 
    1502    See Also 
    1503    -------- 
    1504    busdaycalendar : An object that specifies a custom set of valid days. 
    1505    busday_offset : Applies an offset counted in valid days. 
    1506    busday_count : Counts how many valid days are in a half-open date range. 
    1507 
    1508    Examples 
    1509    -------- 
    1510    >>> import numpy as np 
    1511    >>> # The weekdays are Friday, Saturday, and Monday 
    1512    ... np.is_busday(['2011-07-01', '2011-07-02', '2011-07-18'], 
    1513    ...                 holidays=['2011-07-01', '2011-07-04', '2011-07-17']) 
    1514    array([False, False,  True]) 
    1515    """ 
    1516    return (dates, weekmask, holidays, out) 
    1517 
    1518 
    1519@array_function_from_c_func_and_dispatcher(_multiarray_umath.busday_offset) 
    1520def busday_offset(dates, offsets, roll=None, weekmask=None, holidays=None, 
    1521                  busdaycal=None, out=None): 
    1522    """ 
    1523    busday_offset( 
    1524        dates, 
    1525        offsets, 
    1526        roll='raise', 
    1527        weekmask='1111100', 
    1528        holidays=None, 
    1529        busdaycal=None, 
    1530        out=None 
    1531    ) 
    1532 
    1533    First adjusts the date to fall on a valid day according to 
    1534    the ``roll`` rule, then applies offsets to the given dates 
    1535    counted in valid days. 
    1536 
    1537    Parameters 
    1538    ---------- 
    1539    dates : array_like of datetime64[D] 
    1540        The array of dates to process. 
    1541    offsets : array_like of int 
    1542        The array of offsets, which is broadcast with ``dates``. 
    1543    roll : {'raise', 'nat', 'forward', 'following', 'backward', 'preceding', \ 
    1544        'modifiedfollowing', 'modifiedpreceding'}, optional 
    1545        How to treat dates that do not fall on a valid day. The default 
    1546        is 'raise'. 
    1547 
    1548        * 'raise' means to raise an exception for an invalid day. 
    1549        * 'nat' means to return a NaT (not-a-time) for an invalid day. 
    1550        * 'forward' and 'following' mean to take the first valid day 
    1551          later in time. 
    1552        * 'backward' and 'preceding' mean to take the first valid day 
    1553          earlier in time. 
    1554        * 'modifiedfollowing' means to take the first valid day 
    1555          later in time unless it is across a Month boundary, in which 
    1556          case to take the first valid day earlier in time. 
    1557        * 'modifiedpreceding' means to take the first valid day 
    1558          earlier in time unless it is across a Month boundary, in which 
    1559          case to take the first valid day later in time. 
    1560    weekmask : str or array_like of bool, optional 
    1561        A seven-element array indicating which of Monday through Sunday are 
    1562        valid days. May be specified as a length-seven list or array, like 
    1563        [1,1,1,1,1,0,0]; a length-seven string, like '1111100'; or a string 
    1564        like "Mon Tue Wed Thu Fri", made up of 3-character abbreviations for 
    1565        weekdays, optionally separated by white space. Valid abbreviations 
    1566        are: Mon Tue Wed Thu Fri Sat Sun 
    1567    holidays : array_like of datetime64[D], optional 
    1568        An array of dates to consider as invalid dates.  They may be 
    1569        specified in any order, and NaT (not-a-time) dates are ignored. 
    1570        This list is saved in a normalized form that is suited for 
    1571        fast calculations of valid days. 
    1572    busdaycal : busdaycalendar, optional 
    1573        A `busdaycalendar` object which specifies the valid days. If this 
    1574        parameter is provided, neither weekmask nor holidays may be 
    1575        provided. 
    1576    out : array of datetime64[D], optional 
    1577        If provided, this array is filled with the result. 
    1578 
    1579    Returns 
    1580    ------- 
    1581    out : array of datetime64[D] 
    1582        An array with a shape from broadcasting ``dates`` and ``offsets`` 
    1583        together, containing the dates with offsets applied. 
    1584 
    1585    See Also 
    1586    -------- 
    1587    busdaycalendar : An object that specifies a custom set of valid days. 
    1588    is_busday : Returns a boolean array indicating valid days. 
    1589    busday_count : Counts how many valid days are in a half-open date range. 
    1590 
    1591    Examples 
    1592    -------- 
    1593    >>> import numpy as np 
    1594    >>> # First business day in October 2011 (not accounting for holidays) 
    1595    ... np.busday_offset('2011-10', 0, roll='forward') 
    1596    np.datetime64('2011-10-03') 
    1597    >>> # Last business day in February 2012 (not accounting for holidays) 
    1598    ... np.busday_offset('2012-03', -1, roll='forward') 
    1599    np.datetime64('2012-02-29') 
    1600    >>> # Third Wednesday in January 2011 
    1601    ... np.busday_offset('2011-01', 2, roll='forward', weekmask='Wed') 
    1602    np.datetime64('2011-01-19') 
    1603    >>> # 2012 Mother's Day in Canada and the U.S. 
    1604    ... np.busday_offset('2012-05', 1, roll='forward', weekmask='Sun') 
    1605    np.datetime64('2012-05-13') 
    1606 
    1607    >>> # First business day on or after a date 
    1608    ... np.busday_offset('2011-03-20', 0, roll='forward') 
    1609    np.datetime64('2011-03-21') 
    1610    >>> np.busday_offset('2011-03-22', 0, roll='forward') 
    1611    np.datetime64('2011-03-22') 
    1612    >>> # First business day after a date 
    1613    ... np.busday_offset('2011-03-20', 1, roll='backward') 
    1614    np.datetime64('2011-03-21') 
    1615    >>> np.busday_offset('2011-03-22', 1, roll='backward') 
    1616    np.datetime64('2011-03-23') 
    1617    """ 
    1618    return (dates, offsets, weekmask, holidays, out) 
    1619 
    1620 
    1621@array_function_from_c_func_and_dispatcher(_multiarray_umath.busday_count) 
    1622def busday_count(begindates, enddates, weekmask=None, holidays=None, 
    1623                 busdaycal=None, out=None): 
    1624    """ 
    1625    busday_count( 
    1626        begindates, 
    1627        enddates, 
    1628        weekmask='1111100', 
    1629        holidays=[], 
    1630        busdaycal=None, 
    1631        out=None 
    1632    ) 
    1633 
    1634    Counts the number of valid days between `begindates` and 
    1635    `enddates`, not including the day of `enddates`. 
    1636 
    1637    If ``enddates`` specifies a date value that is earlier than the 
    1638    corresponding ``begindates`` date value, the count will be negative. 
    1639 
    1640    Parameters 
    1641    ---------- 
    1642    begindates : array_like of datetime64[D] 
    1643        The array of the first dates for counting. 
    1644    enddates : array_like of datetime64[D] 
    1645        The array of the end dates for counting, which are excluded 
    1646        from the count themselves. 
    1647    weekmask : str or array_like of bool, optional 
    1648        A seven-element array indicating which of Monday through Sunday are 
    1649        valid days. May be specified as a length-seven list or array, like 
    1650        [1,1,1,1,1,0,0]; a length-seven string, like '1111100'; or a string 
    1651        like "Mon Tue Wed Thu Fri", made up of 3-character abbreviations for 
    1652        weekdays, optionally separated by white space. Valid abbreviations 
    1653        are: Mon Tue Wed Thu Fri Sat Sun 
    1654    holidays : array_like of datetime64[D], optional 
    1655        An array of dates to consider as invalid dates.  They may be 
    1656        specified in any order, and NaT (not-a-time) dates are ignored. 
    1657        This list is saved in a normalized form that is suited for 
    1658        fast calculations of valid days. 
    1659    busdaycal : busdaycalendar, optional 
    1660        A `busdaycalendar` object which specifies the valid days. If this 
    1661        parameter is provided, neither weekmask nor holidays may be 
    1662        provided. 
    1663    out : array of int, optional 
    1664        If provided, this array is filled with the result. 
    1665 
    1666    Returns 
    1667    ------- 
    1668    out : array of int 
    1669        An array with a shape from broadcasting ``begindates`` and ``enddates`` 
    1670        together, containing the number of valid days between 
    1671        the begin and end dates. 
    1672 
    1673    See Also 
    1674    -------- 
    1675    busdaycalendar : An object that specifies a custom set of valid days. 
    1676    is_busday : Returns a boolean array indicating valid days. 
    1677    busday_offset : Applies an offset counted in valid days. 
    1678 
    1679    Examples 
    1680    -------- 
    1681    >>> import numpy as np 
    1682    >>> # Number of weekdays in January 2011 
    1683    ... np.busday_count('2011-01', '2011-02') 
    1684    21 
    1685    >>> # Number of weekdays in 2011 
    1686    >>> np.busday_count('2011', '2012') 
    1687    260 
    1688    >>> # Number of Saturdays in 2011 
    1689    ... np.busday_count('2011', '2012', weekmask='Sat') 
    1690    53 
    1691    """ 
    1692    return (begindates, enddates, weekmask, holidays, out) 
    1693 
    1694 
    1695@array_function_from_c_func_and_dispatcher( 
    1696    _multiarray_umath.datetime_as_string) 
    1697def datetime_as_string(arr, unit=None, timezone=None, casting=None): 
    1698    """ 
    1699    datetime_as_string(arr, unit=None, timezone='naive', casting='same_kind') 
    1700 
    1701    Convert an array of datetimes into an array of strings. 
    1702 
    1703    Parameters 
    1704    ---------- 
    1705    arr : array_like of datetime64 
    1706        The array of UTC timestamps to format. 
    1707    unit : str 
    1708        One of None, 'auto', or 
    1709        a :ref:`datetime unit <arrays.dtypes.dateunits>`. 
    1710    timezone : {'naive', 'UTC', 'local'} or tzinfo 
    1711        Timezone information to use when displaying the datetime. If 'UTC', 
    1712        end with a Z to indicate UTC time. If 'local', convert to the local 
    1713        timezone first, and suffix with a +-#### timezone offset. If a tzinfo 
    1714        object, then do as with 'local', but use the specified timezone. 
    1715    casting : {'no', 'equiv', 'safe', 'same_kind', 'unsafe'} 
    1716        Casting to allow when changing between datetime units. 
    1717 
    1718    Returns 
    1719    ------- 
    1720    str_arr : ndarray 
    1721        An array of strings the same shape as `arr`. 
    1722 
    1723    Examples 
    1724    -------- 
    1725    >>> import numpy as np 
    1726    >>> from zoneinfo import ZoneInfo 
    1727    >>> d = np.arange('2002-10-27T04:30', 4*60, 60, dtype='M8[m]') 
    1728    >>> d 
    1729    array(['2002-10-27T04:30', '2002-10-27T05:30', '2002-10-27T06:30', 
    1730           '2002-10-27T07:30'], dtype='datetime64[m]') 
    1731 
    1732    Setting the timezone to UTC shows the same information, but with a Z suffix 
    1733 
    1734    >>> np.datetime_as_string(d, timezone='UTC') 
    1735    array(['2002-10-27T04:30Z', '2002-10-27T05:30Z', '2002-10-27T06:30Z', 
    1736           '2002-10-27T07:30Z'], dtype='<U35') 
    1737 
    1738    Note that we picked datetimes that cross a DST boundary. Passing in a 
    1739    ``ZoneInfo`` object will print the appropriate offset 
    1740 
    1741    >>> np.datetime_as_string(d, timezone=ZoneInfo('US/Eastern')) 
    1742    array(['2002-10-27T00:30-0400', '2002-10-27T01:30-0400', 
    1743           '2002-10-27T01:30-0500', '2002-10-27T02:30-0500'], dtype='<U39') 
    1744 
    1745    Passing in a unit will change the precision 
    1746 
    1747    >>> np.datetime_as_string(d, unit='h') 
    1748    array(['2002-10-27T04', '2002-10-27T05', '2002-10-27T06', '2002-10-27T07'], 
    1749          dtype='<U32') 
    1750    >>> np.datetime_as_string(d, unit='s') 
    1751    array(['2002-10-27T04:30:00', '2002-10-27T05:30:00', '2002-10-27T06:30:00', 
    1752           '2002-10-27T07:30:00'], dtype='<U38') 
    1753 
    1754    'casting' can be used to specify whether precision can be changed 
    1755 
    1756    >>> np.datetime_as_string(d, unit='h', casting='safe') 
    1757    Traceback (most recent call last): 
    1758        ... 
    1759    TypeError: Cannot create a datetime string as units 'h' from a NumPy 
    1760    datetime with units 'm' according to the rule 'safe' 
    1761    """ 
    1762    return (arr,)