
    Kh                     :   S SK r S SKrS SKJs  Jr  S SKJrJrJrJ	r	J
r
  S SKJrJr  S SKJr  S SKJr  S SKJr  S SKJrJr  S SKJr  S S	KJr  S S
KJr  S SKJr  S SKJr  / SQr\ R@                  " \RB                  SS9r!S r"S r#\!" \#5      S 5       r$S r%\!" \%5      S 5       r&S r'\!" \'5      S 5       r(S r)\!" \)5      S 5       r*S r+\!" \+5      S 5       r,\" S5      SSS.S j5       r-\R\                  \-l.        S r/\!" \/5      S 5       r0S  r1\!" \15      S! 5       r2S" r3S0S# jr4\!" \45      S1S$ j5       r5S0S% jr6\!" \65      S1S& j5       r7S' r8\!" \85      S( 5       r9\!" \85      S) 5       r:\!" \85      S* 5       r;S+ r<S, r=\!" \=5      S- 5       r>S. r?\!" \?5      S/ 5       r@g)2    N)asarrayzeros
zeros_likearray
asanyarray)reshape	transpose)normalize_axis_index)_array_converter)	overrides)vstack
atleast_3d)normalize_axis_tuple)
set_module_arrays_for_stack_dispatcher)ndindex)matrix)column_stack	row_stackdstackarray_splitsplithsplitvsplitdsplitapply_over_axesexpand_dimsapply_along_axiskrontiletake_along_axisput_along_axisnumpy)modulec                 R   [         R                  " UR                  [         R                  5      (       d  [	        S5      e[        U 5      UR                  :w  a  [        S5      eSUR                  -  n[        [        U5      5      S /-   [        [        US-   UR                  5      5      -   n/ n[        X@5       H_  u  pgUc  UR                  U5        M  US U S-   X6S-   S  -   nUR                  [         R                  " U5      R                  U5      5        Ma     [        U5      $ )Nz"`indices` must be an integer arrayz;`indices` and `arr` must have the same number of dimensions   r(   ))_nx
issubdtypedtypeinteger
IndexErrorlenndim
ValueErrorlistrangezipappendaranger   tuple)		arr_shapeindicesaxis
shape_ones	dest_dimsfancy_indexdimn	ind_shapes	            L/var/www/html/env/lib/python3.13/site-packages/numpy/lib/_shape_base_impl.py_make_along_axis_idxrB      s    >>'--55=>>
9~%IK 	K$JU4[!TF*T%Q2M-NNI Ki+;w'"4C(50:!ef3EEIszz!}44Y?@ ,     c                     X4$ N )arrr9   r:   s      rA   _take_along_axis_dispatcherrH   5   s
    >rC   c                     Uc6  UR                   S:w  a  [        S5      eU R                  n [        U 5      4nSnO![	        X R                   5      nU R
                  nU [        X1U5         $ )a*  
Take values from the input array by matching 1d index and data slices.

This iterates over matching 1d slices oriented along the specified axis in
the index and data arrays, and uses the former to look up values in the
latter. These slices can be different lengths.

Functions returning an index along an axis, like `argsort` and
`argpartition`, produce suitable indices for this function.

Parameters
----------
arr : ndarray (Ni..., M, Nk...)
    Source array
indices : ndarray (Ni..., J, Nk...)
    Indices to take along each 1d slice of `arr`. This must match the
    dimension of arr, but dimensions Ni and Nj only need to broadcast
    against `arr`.
axis : int
    The axis to take 1d slices along. If axis is None, the input array is
    treated as if it had first been flattened to 1d, for consistency with
    `sort` and `argsort`.

Returns
-------
out: ndarray (Ni..., J, Nk...)
    The indexed result.

Notes
-----
This is equivalent to (but faster than) the following use of `ndindex` and
`s_`, which sets each of ``ii`` and ``kk`` to a tuple of indices::

    Ni, M, Nk = a.shape[:axis], a.shape[axis], a.shape[axis+1:]
    J = indices.shape[axis]  # Need not equal M
    out = np.empty(Ni + (J,) + Nk)

    for ii in ndindex(Ni):
        for kk in ndindex(Nk):
            a_1d       = a      [ii + s_[:,] + kk]
            indices_1d = indices[ii + s_[:,] + kk]
            out_1d     = out    [ii + s_[:,] + kk]
            for j in range(J):
                out_1d[j] = a_1d[indices_1d[j]]

Equivalently, eliminating the inner loop, the last two lines would be::

            out_1d[:] = a_1d[indices_1d]

See Also
--------
take : Take along an axis, using the same indices for every 1d slice
put_along_axis :
    Put values into the destination array by matching 1d index and data slices

Examples
--------
>>> import numpy as np

For this sample array

>>> a = np.array([[10, 30, 20], [60, 40, 50]])

We can sort either by using sort directly, or argsort and this function

>>> np.sort(a, axis=1)
array([[10, 20, 30],
       [40, 50, 60]])
>>> ai = np.argsort(a, axis=1)
>>> ai
array([[0, 2, 1],
       [1, 2, 0]])
>>> np.take_along_axis(a, ai, axis=1)
array([[10, 20, 30],
       [40, 50, 60]])

The same works for max and min, if you maintain the trivial dimension
with ``keepdims``:

>>> np.max(a, axis=1, keepdims=True)
array([[30],
       [60]])
>>> ai = np.argmax(a, axis=1, keepdims=True)
>>> ai
array([[1],
       [0]])
>>> np.take_along_axis(a, ai, axis=1)
array([[30],
       [60]])

If we want to get the max and min at the same time, we can stack the
indices first

>>> ai_min = np.argmin(a, axis=1, keepdims=True)
>>> ai_max = np.argmax(a, axis=1, keepdims=True)
>>> ai = np.concatenate([ai_min, ai_max], axis=1)
>>> ai
array([[0, 1],
       [1, 0]])
>>> np.take_along_axis(a, ai, axis=1)
array([[10, 30],
       [40, 60]])
r(   7when axis=None, `indices` must have a single dimension.r   r0   r1   flatr/   r
   shaperB   )rG   r9   r:   r8   s       rA   r"   r"   9   sm    T |<<1IK KhhXK	#D((3II	 #I=>>rC   c                 
    XU4$ rE   rF   )rG   r9   valuesr:   s       rA   _put_along_axis_dispatcherrP      s    &!!rC   c                     Uc6  UR                   S:w  a  [        S5      eU R                  n Sn[        U 5      4nO![	        X0R                   5      nU R
                  nX [        XAU5      '   g)a$  
Put values into the destination array by matching 1d index and data slices.

This iterates over matching 1d slices oriented along the specified axis in
the index and data arrays, and uses the former to place values into the
latter. These slices can be different lengths.

Functions returning an index along an axis, like `argsort` and
`argpartition`, produce suitable indices for this function.

Parameters
----------
arr : ndarray (Ni..., M, Nk...)
    Destination array.
indices : ndarray (Ni..., J, Nk...)
    Indices to change along each 1d slice of `arr`. This must match the
    dimension of arr, but dimensions in Ni and Nj may be 1 to broadcast
    against `arr`.
values : array_like (Ni..., J, Nk...)
    values to insert at those indices. Its shape and dimension are
    broadcast to match that of `indices`.
axis : int
    The axis to take 1d slices along. If axis is None, the destination
    array is treated as if a flattened 1d view had been created of it.

Notes
-----
This is equivalent to (but faster than) the following use of `ndindex` and
`s_`, which sets each of ``ii`` and ``kk`` to a tuple of indices::

    Ni, M, Nk = a.shape[:axis], a.shape[axis], a.shape[axis+1:]
    J = indices.shape[axis]  # Need not equal M

    for ii in ndindex(Ni):
        for kk in ndindex(Nk):
            a_1d       = a      [ii + s_[:,] + kk]
            indices_1d = indices[ii + s_[:,] + kk]
            values_1d  = values [ii + s_[:,] + kk]
            for j in range(J):
                a_1d[indices_1d[j]] = values_1d[j]

Equivalently, eliminating the inner loop, the last two lines would be::

            a_1d[indices_1d] = values_1d

See Also
--------
take_along_axis :
    Take values from the input array by matching 1d index and data slices

Examples
--------
>>> import numpy as np

For this sample array

>>> a = np.array([[10, 30, 20], [60, 40, 50]])

We can replace the maximum values with:

>>> ai = np.argmax(a, axis=1, keepdims=True)
>>> ai
array([[1],
       [0]])
>>> np.put_along_axis(a, ai, 99, axis=1)
>>> a
array([[10, 99, 20],
       [99, 40, 50]])

Nr(   rJ   r   rK   )rG   r9   rO   r:   r8   s        rA   r#   r#      sk    R |<<1IK KhhXK	#D((3II	 ;AY67rC   c                     U4$ rE   rF   )func1dr:   rG   argskwargss        rA   _apply_along_axis_dispatcherrV     s	    6MrC   c                    [        U5      nUS   nUR                  n[        X5      n[        [	        U5      5      n[        X'SU XqS-   S -   U/-   5      n[        UR                  SS 5      n	S U	 5       n	 [        U	5      n
[        U " X   /UQ70 UD65      n[        U[        5      (       d$  [        XR                  SS UR                  -   S9nO.[        UR                  SS UR                  -   UR                   S9n[        [	        UR                  5      5      nUSU XR                  UR                  -
  UR                   -   XUR                  UR                  -
   -   nXU
'   U	 H  n[        U " X   /UQ70 UD65      X'   M     [        X5      nUR#                  U5      $ ! [         a    [        S5      Sef = f)	a*
  
Apply a function to 1-D slices along the given axis.

Execute `func1d(a, *args, **kwargs)` where `func1d` operates on 1-D arrays
and `a` is a 1-D slice of `arr` along `axis`.

This is equivalent to (but faster than) the following use of `ndindex` and
`s_`, which sets each of ``ii``, ``jj``, and ``kk`` to a tuple of indices::

    Ni, Nk = a.shape[:axis], a.shape[axis+1:]
    for ii in ndindex(Ni):
        for kk in ndindex(Nk):
            f = func1d(arr[ii + s_[:,] + kk])
            Nj = f.shape
            for jj in ndindex(Nj):
                out[ii + jj + kk] = f[jj]

Equivalently, eliminating the inner loop, this can be expressed as::

    Ni, Nk = a.shape[:axis], a.shape[axis+1:]
    for ii in ndindex(Ni):
        for kk in ndindex(Nk):
            out[ii + s_[...,] + kk] = func1d(arr[ii + s_[:,] + kk])

Parameters
----------
func1d : function (M,) -> (Nj...)
    This function should accept 1-D arrays. It is applied to 1-D
    slices of `arr` along the specified axis.
axis : integer
    Axis along which `arr` is sliced.
arr : ndarray (Ni..., M, Nk...)
    Input array.
args : any
    Additional arguments to `func1d`.
kwargs : any
    Additional named arguments to `func1d`.

Returns
-------
out : ndarray  (Ni..., Nj..., Nk...)
    The output array. The shape of `out` is identical to the shape of
    `arr`, except along the `axis` dimension. This axis is removed, and
    replaced with new dimensions equal to the shape of the return value
    of `func1d`. So if `func1d` returns a scalar `out` will have one
    fewer dimensions than `arr`.

See Also
--------
apply_over_axes : Apply a function repeatedly over multiple axes.

Examples
--------
>>> import numpy as np
>>> def my_func(a):
...     """Average first and last element of a 1-D array"""
...     return (a[0] + a[-1]) * 0.5
>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> np.apply_along_axis(my_func, 0, b)
array([4., 5., 6.])
>>> np.apply_along_axis(my_func, 1, b)
array([2.,  5.,  8.])

For a function that returns a 1D array, the number of dimensions in
`outarr` is the same as `arr`.

>>> b = np.array([[8,1,7], [4,3,9], [5,2,6]])
>>> np.apply_along_axis(sorted, 1, b)
array([[1, 7, 8],
       [3, 4, 9],
       [2, 5, 6]])

For a function that returns a higher dimensional array, those dimensions
are inserted in place of the `axis` dimension.

>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> np.apply_along_axis(np.diag, -1, b)
array([[[1, 0, 0],
        [0, 2, 0],
        [0, 0, 3]],
       [[4, 0, 0],
        [0, 5, 0],
        [0, 0, 6]],
       [[7, 0, 0],
        [0, 8, 0],
        [0, 0, 9]]])
r   Nr(   r)   c              3   4   #    U  H  o[         4-   v   M     g 7frE   )Ellipsis).0inds     rA   	<genexpr>#apply_along_axis.<locals>.<genexpr>y  s     .#8+s   z;Cannot apply_along_axis when any iteration dimensions are 0)rM   r,   )r   r0   r
   r2   r3   r	   r   rM   nextStopIterationr1   r   
isinstancer   r   r   r,   wrap)rS   r:   rG   rT   rU   convndin_dims
inarr_viewindsind0resbuff	buff_dimsbuff_permuter[   s                   rA   r   r     s   t C D
q'C	B)D 59oG3a1A ATF JKJ :##CR()D..DDz
 VJ,>t>v>
?C c6""#%5%5cr%:SYY%FG Z%%cr*SYY6ciiH U499%&I!d))CHH$tyy1	2388+,	-  JvjoGGGH	  D
'C99S>=  I
	s   8F( (F?c                     U4$ rE   rF   )funcaaxess      rA   _apply_over_axes_dispatcherrq     	    4KrC   c                 B   [        U5      nUR                  n[        U5      R                  S:X  a  U4nU He  nUS:  a  XE-   nX54nU " U6 nUR                  UR                  :X  a  UnM3  [        Xu5      nUR                  UR                  :X  a  UnM\  [	        S5      e   U$ )a  
Apply a function repeatedly over multiple axes.

`func` is called as `res = func(a, axis)`, where `axis` is the first
element of `axes`.  The result `res` of the function call must have
either the same dimensions as `a` or one less dimension.  If `res`
has one less dimension than `a`, a dimension is inserted before
`axis`.  The call to `func` is then repeated for each axis in `axes`,
with `res` as the first argument.

Parameters
----------
func : function
    This function must take two arguments, `func(a, axis)`.
a : array_like
    Input array.
axes : array_like
    Axes over which `func` is applied; the elements must be integers.

Returns
-------
apply_over_axis : ndarray
    The output array.  The number of dimensions is the same as `a`,
    but the shape can be different.  This depends on whether `func`
    changes the shape of its output with respect to its input.

See Also
--------
apply_along_axis :
    Apply a function to 1-D slices of an array along the given axis.

Notes
-----
This function is equivalent to tuple axis arguments to reorderable ufuncs
with keepdims=True. Tuple axis arguments to ufuncs have been available since
version 1.7.0.

Examples
--------
>>> import numpy as np
>>> a = np.arange(24).reshape(2,3,4)
>>> a
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],
       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

Sum over axes 0 and 2. The result has same number of dimensions
as the original array:

>>> np.apply_over_axes(np.sum, a, [0,2])
array([[[ 60],
        [ 92],
        [124]]])

Tuple axis arguments to ufuncs are equivalent:

>>> np.sum(a, axis=(0,2), keepdims=True)
array([[[ 60],
        [ 92],
        [124]]])

r   z7function is not returning an array of the correct shape)r   r0   r   r   r1   )rn   ro   rp   valNr:   rT   ri   s           rA   r   r     s    F !*C	AT{1w!88D{Dk88sxxCc(Cxx388#  "A B B  JrC   c                     U 4$ rE   rF   )ro   r:   s     rA   _expand_dims_dispatcherrw     rr   rC   c                    [        U [        5      (       a  [        U 5      n O[        U 5      n [	        U5      [
        [        4;  a  U4n[        U5      U R                  -   n[        X5      n[        U R                  5      n[        U5       Vs/ s H  oDU;   a  SO
[        U5      PM     nnU R                  U5      $ s  snf )a  
Expand the shape of an array.

Insert a new axis that will appear at the `axis` position in the expanded
array shape.

Parameters
----------
a : array_like
    Input array.
axis : int or tuple of ints
    Position in the expanded axes where the new axis (or axes) is placed.

    .. deprecated:: 1.13.0
        Passing an axis where ``axis > a.ndim`` will be treated as
        ``axis == a.ndim``, and passing ``axis < -a.ndim - 1`` will
        be treated as ``axis == 0``. This behavior is deprecated.

Returns
-------
result : ndarray
    View of `a` with the number of dimensions increased.

See Also
--------
squeeze : The inverse operation, removing singleton dimensions
reshape : Insert, remove, and combine dimensions, and resize existing ones
atleast_1d, atleast_2d, atleast_3d

Examples
--------
>>> import numpy as np
>>> x = np.array([1, 2])
>>> x.shape
(2,)

The following is equivalent to ``x[np.newaxis, :]`` or ``x[np.newaxis]``:

>>> y = np.expand_dims(x, axis=0)
>>> y
array([[1, 2]])
>>> y.shape
(1, 2)

The following is equivalent to ``x[:, np.newaxis]``:

>>> y = np.expand_dims(x, axis=1)
>>> y
array([[1],
       [2]])
>>> y.shape
(2, 1)

``axis`` may also be a tuple:

>>> y = np.expand_dims(x, axis=(0, 1))
>>> y
array([[[1, 2]]])

>>> y = np.expand_dims(x, axis=(2, 0))
>>> y
array([[[1],
        [2]]])

Note that some examples may use ``None`` instead of ``np.newaxis``.  These
are the same objects:

>>> np.newaxis is None
True

r(   )ra   r   r   r   typer7   r2   r/   r0   r   iterrM   r3   r_   r   )ro   r:   out_ndimshape_itaxrM   s         rA   r   r     s    R !VAJqMDz%&w4y166!H/DAGG}H;@?K?R*Q$x.0?EK99U Ls   B=	same_kindr,   castingc                J    [         R                  " S[        SS9  [        XUS9$ )Nz:`row_stack` alias is deprecated. Use `np.vstack` directly.   
stacklevelr   )warningswarnDeprecationWarningr   )tupr,   r   s      rA   r   r   Z  s*     MM	$	 #G44rC   c                     [        U 5      $ rE   r   r   s    rA   _column_stack_dispatcherr   i      ',,rC   c                     / nU  HE  n[        U5      nUR                  S:  a  [        USSSS9R                  nUR	                  U5        MG     [
        R                  " US5      $ )a  
Stack 1-D arrays as columns into a 2-D array.

Take a sequence of 1-D arrays and stack them as columns
to make a single 2-D array. 2-D arrays are stacked as-is,
just like with `hstack`.  1-D arrays are turned into 2-D columns
first.

Parameters
----------
tup : sequence of 1-D or 2-D arrays.
    Arrays to stack. All of them must have the same first dimension.

Returns
-------
stacked : 2-D array
    The array formed by stacking the given arrays.

See Also
--------
stack, hstack, vstack, concatenate

Examples
--------
>>> import numpy as np
>>> a = np.array((1,2,3))
>>> b = np.array((2,3,4))
>>> np.column_stack((a,b))
array([[1, 2],
       [2, 3],
       [3, 4]])

r   NTcopysubokndminr(   )r   r0   r   Tr5   r*   concatenate)r   arraysvrG   s       rA   r   r   m  s]    F Fm88a<$d!<>>Cc	 
 ??61%%rC   c                     [        U 5      $ rE   r   r   s    rA   _dstack_dispatcherr     r   rC   c                 p    [        U 6 n[        U[        5      (       d  U4n[        R                  " US5      $ )a  
Stack arrays in sequence depth wise (along third axis).

This is equivalent to concatenation along the third axis after 2-D arrays
of shape `(M,N)` have been reshaped to `(M,N,1)` and 1-D arrays of shape
`(N,)` have been reshaped to `(1,N,1)`. Rebuilds arrays divided by
`dsplit`.

This function makes most sense for arrays with up to 3 dimensions. For
instance, for pixel-data with a height (first axis), width (second axis),
and r/g/b channels (third axis). The functions `concatenate`, `stack` and
`block` provide more general stacking and concatenation operations.

Parameters
----------
tup : sequence of arrays
    The arrays must have the same shape along all but the third axis.
    1-D or 2-D arrays must have the same shape.

Returns
-------
stacked : ndarray
    The array formed by stacking the given arrays, will be at least 3-D.

See Also
--------
concatenate : Join a sequence of arrays along an existing axis.
stack : Join a sequence of arrays along a new axis.
block : Assemble an nd-array from nested lists of blocks.
vstack : Stack arrays in sequence vertically (row wise).
hstack : Stack arrays in sequence horizontally (column wise).
column_stack : Stack 1-D arrays as columns into a 2-D array.
dsplit : Split array along third axis.

Examples
--------
>>> import numpy as np
>>> a = np.array((1,2,3))
>>> b = np.array((2,3,4))
>>> np.dstack((a,b))
array([[[1, 2],
        [2, 3],
        [3, 4]]])

>>> a = np.array([[1],[2],[3]])
>>> b = np.array([[2],[3],[4]])
>>> np.dstack((a,b))
array([[[1, 2]],
       [[2, 3]],
       [[3, 4]]])

r   )r   ra   r7   r*   r   )r   arrss     rA   r   r     s4    l sDdE""w??4##rC   c           	         [        [        U 5      5       H  n[        R                  " X   5      S:X  a%  [        R                  " SX   R
                  S9X'   MD  [        R                  " [        R                  " [        R                  " X   5      S5      5      (       d  M  [        R                  " SX   R
                  S9X'   M     U $ )Nr   r^   )	r3   r/   r*   r0   emptyr,   sometrueequalrM   )sub_arysis     rA   _replace_zero_by_x_arraysr     s    3x=!88HK A%))AX[->->?HK\\#))CIIhk$:A>??))AX[->->?HK	 "
 OrC   c                     X4$ rE   rF   aryindices_or_sectionsr:   s      rA   _array_split_dispatcherr         %%rC   c                 ^    U R                   U   n [        U5      S-   nS/[        U5      -   U/-   n/ n	[        R                  " XS5      n
[        U5       H7  nX[   nX[S-      nU	R                  [        R                  " XU US5      5        M9     U	$ ! [         a    [        U 5      n Nf = f! [         as    [        U5      nUS::  a  [        S5      Se[        X45      u  pgS/XvS-   /-  -   XG-
  U/-  -   n[        R                  " U[        R                  S9R                  5       n Nf = f)a  
Split an array into multiple sub-arrays.

Please refer to the ``split`` documentation.  The only difference
between these functions is that ``array_split`` allows
`indices_or_sections` to be an integer that does *not* equally
divide the axis. For an array of length l that should be split
into n sections, it returns l % n sub-arrays of size l//n + 1
and the rest of size l//n.

See Also
--------
split : Split array into multiple sub-arrays of equal size.

Examples
--------
>>> import numpy as np
>>> x = np.arange(8.0)
>>> np.array_split(x, 3)
[array([0.,  1.,  2.]), array([3.,  4.,  5.]), array([6.,  7.])]

>>> x = np.arange(9)
>>> np.array_split(x, 4)
[array([0, 1, 2]), array([3, 4]), array([5, 6]), array([7, 8])]

r(   r   z&number sections must be larger than 0.Nr^   )rM   AttributeErrorr/   r2   	TypeErrorintr1   divmodr*   r   intpcumsumswapaxesr3   r5   )r   r   r:   Ntotal	Nsections
div_pointsNeach_sectionextrassection_sizesr   saryr   stends                 rA   r   r     sC   84G+,q0	S4 344x?
 H<<1%D9]QTS\4;< 
 O1  S  	G+,	>EFDP &v 9?"334#*}o=> YY}CHH=DDF
	Gs#   B !B/ B,+B,/A:D,+D,c                     X4$ rE   rF   r   s      rA   _split_dispatcherr     r   rC   c                      [        U5        [	        XU5      $ ! [         a)    UnU R                  U   nXC-  (       a  [        S5      Se N>f = f)a  
Split an array into multiple sub-arrays as views into `ary`.

Parameters
----------
ary : ndarray
    Array to be divided into sub-arrays.
indices_or_sections : int or 1-D array
    If `indices_or_sections` is an integer, N, the array will be divided
    into N equal arrays along `axis`.  If such a split is not possible,
    an error is raised.

    If `indices_or_sections` is a 1-D array of sorted integers, the entries
    indicate where along `axis` the array is split.  For example,
    ``[2, 3]`` would, for ``axis=0``, result in

    - ary[:2]
    - ary[2:3]
    - ary[3:]

    If an index exceeds the dimension of the array along `axis`,
    an empty sub-array is returned correspondingly.
axis : int, optional
    The axis along which to split, default is 0.

Returns
-------
sub-arrays : list of ndarrays
    A list of sub-arrays as views into `ary`.

Raises
------
ValueError
    If `indices_or_sections` is given as an integer, but
    a split does not result in equal division.

See Also
--------
array_split : Split an array into multiple sub-arrays of equal or
              near-equal size.  Does not raise an exception if
              an equal division cannot be made.
hsplit : Split array into multiple sub-arrays horizontally (column-wise).
vsplit : Split array into multiple sub-arrays vertically (row wise).
dsplit : Split array into multiple sub-arrays along the 3rd axis (depth).
concatenate : Join a sequence of arrays along an existing axis.
stack : Join a sequence of arrays along a new axis.
hstack : Stack arrays in sequence horizontally (column wise).
vstack : Stack arrays in sequence vertically (row wise).
dstack : Stack arrays in sequence depth wise (along third dimension).

Examples
--------
>>> import numpy as np
>>> x = np.arange(9.0)
>>> np.split(x, 3)
[array([0.,  1.,  2.]), array([3.,  4.,  5.]), array([6.,  7.,  8.])]

>>> x = np.arange(8.0)
>>> np.split(x, [3, 5, 6, 10])
[array([0.,  1.,  2.]),
 array([3.,  4.]),
 array([5.]),
 array([6.,  7.]),
 array([], dtype=float64)]

z0array split does not result in an equal divisionN)r/   r   rM   r1   r   )r   r   r:   sectionsru   s        rA   r   r   #  se    HN  s66  N&IIdO<BDIMN Ns    0AAc                     X4$ rE   rF   r   r   s     rA   _hvdsplit_dispatcherr   r  r   rC   c                     [         R                  " U 5      S:X  a  [        S5      eU R                  S:  a  [        XS5      $ [        XS5      $ )a  
Split an array into multiple sub-arrays horizontally (column-wise).

Please refer to the `split` documentation.  `hsplit` is equivalent
to `split` with ``axis=1``, the array is always split along the second
axis except for 1-D arrays, where it is split at ``axis=0``.

See Also
--------
split : Split an array into multiple sub-arrays of equal size.

Examples
--------
>>> import numpy as np
>>> x = np.arange(16.0).reshape(4, 4)
>>> x
array([[ 0.,   1.,   2.,   3.],
       [ 4.,   5.,   6.,   7.],
       [ 8.,   9.,  10.,  11.],
       [12.,  13.,  14.,  15.]])
>>> np.hsplit(x, 2)
[array([[  0.,   1.],
       [  4.,   5.],
       [  8.,   9.],
       [12.,  13.]]),
 array([[  2.,   3.],
       [  6.,   7.],
       [10.,  11.],
       [14.,  15.]])]
>>> np.hsplit(x, np.array([3, 6]))
[array([[ 0.,   1.,   2.],
       [ 4.,   5.,   6.],
       [ 8.,   9.,  10.],
       [12.,  13.,  14.]]),
 array([[ 3.],
       [ 7.],
       [11.],
       [15.]]),
 array([], shape=(4, 0), dtype=float64)]

With a higher dimensional array the split is still along the second axis.

>>> x = np.arange(8.0).reshape(2, 2, 2)
>>> x
array([[[0.,  1.],
        [2.,  3.]],
       [[4.,  5.],
        [6.,  7.]]])
>>> np.hsplit(x, 2)
[array([[[0.,  1.]],
       [[4.,  5.]]]),
 array([[[2.,  3.]],
       [[6.,  7.]]])]

With a 1-D array, the split is along axis 0.

>>> x = np.array([0, 1, 2, 3, 4, 5])
>>> np.hsplit(x, 2)
[array([0, 1, 2]), array([3, 4, 5])]

r   z3hsplit only works on arrays of 1 or more dimensionsr(   r*   r0   r1   r   r   s     rA   r   r   v  sF    ~ xx}NOO
xx!|Sq11Sq11rC   c                 d    [         R                  " U 5      S:  a  [        S5      e[        XS5      $ )a  
Split an array into multiple sub-arrays vertically (row-wise).

Please refer to the ``split`` documentation.  ``vsplit`` is equivalent
to ``split`` with `axis=0` (default), the array is always split along the
first axis regardless of the array dimension.

See Also
--------
split : Split an array into multiple sub-arrays of equal size.

Examples
--------
>>> import numpy as np
>>> x = np.arange(16.0).reshape(4, 4)
>>> x
array([[ 0.,   1.,   2.,   3.],
       [ 4.,   5.,   6.,   7.],
       [ 8.,   9.,  10.,  11.],
       [12.,  13.,  14.,  15.]])
>>> np.vsplit(x, 2)
[array([[0., 1., 2., 3.],
        [4., 5., 6., 7.]]),
 array([[ 8.,  9., 10., 11.],
        [12., 13., 14., 15.]])]
>>> np.vsplit(x, np.array([3, 6]))
[array([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.]]),
 array([[12., 13., 14., 15.]]),
 array([], shape=(0, 4), dtype=float64)]

With a higher dimensional array the split is still along the first axis.

>>> x = np.arange(8.0).reshape(2, 2, 2)
>>> x
array([[[0.,  1.],
        [2.,  3.]],
       [[4.,  5.],
        [6.,  7.]]])
>>> np.vsplit(x, 2)
[array([[[0., 1.],
         [2., 3.]]]),
 array([[[4., 5.],
         [6., 7.]]])]

r   z3vsplit only works on arrays of 2 or more dimensionsr   r   r   s     rA   r   r     s.    b xx}qNOO1--rC   c                 d    [         R                  " U 5      S:  a  [        S5      e[        XS5      $ )a  
Split array into multiple sub-arrays along the 3rd axis (depth).

Please refer to the `split` documentation.  `dsplit` is equivalent
to `split` with ``axis=2``, the array is always split along the third
axis provided the array dimension is greater than or equal to 3.

See Also
--------
split : Split an array into multiple sub-arrays of equal size.

Examples
--------
>>> import numpy as np
>>> x = np.arange(16.0).reshape(2, 2, 4)
>>> x
array([[[ 0.,   1.,   2.,   3.],
        [ 4.,   5.,   6.,   7.]],
       [[ 8.,   9.,  10.,  11.],
        [12.,  13.,  14.,  15.]]])
>>> np.dsplit(x, 2)
[array([[[ 0.,  1.],
        [ 4.,  5.]],
       [[ 8.,  9.],
        [12., 13.]]]), array([[[ 2.,  3.],
        [ 6.,  7.]],
       [[10., 11.],
        [14., 15.]]])]
>>> np.dsplit(x, np.array([3, 6]))
[array([[[ 0.,   1.,   2.],
        [ 4.,   5.,   6.]],
       [[ 8.,   9.,  10.],
        [12.,  13.,  14.]]]),
 array([[[ 3.],
        [ 7.]],
       [[11.],
        [15.]]]),
array([], shape=(2, 2, 0), dtype=float64)]
   z3dsplit only works on arrays of 3 or more dimensionsr   r   r   s     rA   r   r     s.    R xx}qNOO1--rC   c                      [         R                  " S[        SS9  [        S [	        U 5       5       5      nU(       a  US   S   $ g)zFind the wrapper for the array with the highest priority.

In case of ties, leftmost wins. If no wrapper is found, return None.

.. deprecated:: 2.0
z9`get_array_wrap` is deprecated. (deprecated in NumPy 2.0)r   r   c              3      #    U  H5  u  p[        US 5      (       d  M  [        USS5      U* UR                  4v   M7     g7f)__array_wrap____array_priority__r   N)hasattrgetattrr   )rZ   r   xs      rA   r\   !get_array_wrap.<locals>.<genexpr>1  sC      D/>tq&-a1A&B#wq"6:QB!!#/>s   ?"?r)   N)r   r   r   sorted	enumerate)rT   wrapperss     rA   get_array_wrapr   !  sR     MM	$	  D/8D DH |BrC   c                     X4$ rE   rF   )ro   bs     rA   _kron_dispatcherr   9  s	    6MrC   c           
         [        U5      n[        U SSUR                  S9n [        U [        5      =(       d    [        U[        5      nUR                  U R                  pC[        X45      nUS:X  d  US:X  a  [        R                  " X5      $ U R                  nUR                  nU R                  R                  (       d  [        X5      n UR                  R                  (       d  [        X5      nS[        SX4-
  5      -  U-   nS[        SXC-
  5      -  U-   n[        U [        [        X4-
  5      5      S9n[        U[        [        XC-
  5      5      S9n	[        U[        [        SUS-  S5      5      S9n[        U	[        [        SUS-  S5      5      S9n	[        R                  " XU(       + S	9n
U
R                  [        R                  " Xg5      5      n
U(       d  U
$ [	        U
S
S9$ )aM  
Kronecker product of two arrays.

Computes the Kronecker product, a composite array made of blocks of the
second array scaled by the first.

Parameters
----------
a, b : array_like

Returns
-------
out : ndarray

See Also
--------
outer : The outer product

Notes
-----
The function assumes that the number of dimensions of `a` and `b`
are the same, if necessary prepending the smallest with ones.
If ``a.shape = (r0,r1,..,rN)`` and ``b.shape = (s0,s1,...,sN)``,
the Kronecker product has shape ``(r0*s0, r1*s1, ..., rN*SN)``.
The elements are products of elements from `a` and `b`, organized
explicitly by::

    kron(a,b)[k0,k1,...,kN] = a[i0,i1,...,iN] * b[j0,j1,...,jN]

where::

    kt = it * st + jt,  t = 0,...,N

In the common 2-D case (N=1), the block structure can be visualized::

    [[ a[0,0]*b,   a[0,1]*b,  ... , a[0,-1]*b  ],
     [  ...                              ...   ],
     [ a[-1,0]*b,  a[-1,1]*b, ... , a[-1,-1]*b ]]


Examples
--------
>>> import numpy as np
>>> np.kron([1,10,100], [5,6,7])
array([  5,   6,   7, ..., 500, 600, 700])
>>> np.kron([5,6,7], [1,10,100])
array([  5,  50, 500, ...,   7,  70, 700])

>>> np.kron(np.eye(2), np.ones((2,2)))
array([[1.,  1.,  0.,  0.],
       [1.,  1.,  0.,  0.],
       [0.,  0.,  1.,  1.],
       [0.,  0.,  1.,  1.]])

>>> a = np.arange(100).reshape((2,5,2,5))
>>> b = np.arange(24).reshape((2,3,4))
>>> c = np.kron(a,b)
>>> c.shape
(2, 10, 6, 20)
>>> I = (1,3,0,2)
>>> J = (0,2,1)
>>> J1 = (0,) + J             # extend to ndim=4
>>> S1 = (1,) + b.shape
>>> K = tuple(np.array(I) * np.array(S1) + np.array(J1))
>>> c[K] == a[I]*b[J]
True

NTr   r   r'   )r:   r(   r   )r   F)r   )r   r   r0   ra   r   maxr*   multiplyrM   flags
contiguousr   r   r7   r3   )ro   r   
is_any_matndbndard   as_bsa_arrb_arrresults              rA   r    r    =  s   ^ 	1Aad$aff5AAv&?*Q*?Jvvqvv	SBqC1H||A!!
''C	
B77AO77AN s1cg

$C	c!SWo		"B eCGn 56EeCGn 56E E%2a4*;$<=EE%2a4*;$<=E\\%:~?F ^^CLL12F#6CU)CCrC   c                     X4$ rE   rF   )Arepss     rA   _tile_dispatcherr     s
    9rC   c                     [        U5      n[        U5      n[        S U 5       5      (       a6  [	        U [
        R                  5      (       a  [
        R                  " U SSUS9$ [
        R                  " U SSUS9nX4R                  :  a  SUR                  U-
  -  U-   n[        S [        UR                  U5       5       5      nUR                  nUS:  aK  [        UR                  U5       H1  u  pxUS:w  a"  UR                  S	U5      R                  US5      nXg-  nM3     UR                  U5      $ ! [         a    U4n GN7f = f)
aX  
Construct an array by repeating A the number of times given by reps.

If `reps` has length ``d``, the result will have dimension of
``max(d, A.ndim)``.

If ``A.ndim < d``, `A` is promoted to be d-dimensional by prepending new
axes. So a shape (3,) array is promoted to (1, 3) for 2-D replication,
or shape (1, 1, 3) for 3-D replication. If this is not the desired
behavior, promote `A` to d-dimensions manually before calling this
function.

If ``A.ndim > d``, `reps` is promoted to `A`.ndim by prepending 1's to it.
Thus for an `A` of shape (2, 3, 4, 5), a `reps` of (2, 2) is treated as
(1, 1, 2, 2).

Note : Although tile may be used for broadcasting, it is strongly
recommended to use numpy's broadcasting operations and functions.

Parameters
----------
A : array_like
    The input array.
reps : array_like
    The number of repetitions of `A` along each axis.

Returns
-------
c : ndarray
    The tiled output array.

See Also
--------
repeat : Repeat elements of an array.
broadcast_to : Broadcast an array to a new shape

Examples
--------
>>> import numpy as np
>>> a = np.array([0, 1, 2])
>>> np.tile(a, 2)
array([0, 1, 2, 0, 1, 2])
>>> np.tile(a, (2, 2))
array([[0, 1, 2, 0, 1, 2],
       [0, 1, 2, 0, 1, 2]])
>>> np.tile(a, (2, 1, 2))
array([[[0, 1, 2, 0, 1, 2]],
       [[0, 1, 2, 0, 1, 2]]])

>>> b = np.array([[1, 2], [3, 4]])
>>> np.tile(b, 2)
array([[1, 2, 1, 2],
       [3, 4, 3, 4]])
>>> np.tile(b, (2, 1))
array([[1, 2],
       [3, 4],
       [1, 2],
       [3, 4]])

>>> c = np.array([1,2,3,4])
>>> np.tile(c,(4,1))
array([[1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4]])
c              3   *   #    U  H	  oS :H  v   M     g7f)r(   NrF   )rZ   r   s     rA   r\   tile.<locals>.<genexpr>  s     
3a63s   Tr   Nr'   c              3   .   #    U  H  u  pX-  v   M     g 7frE   rF   )rZ   sts      rA   r\   r     s     8&7daac&7s   r   r(   r)   )r7   r   r/   allra   r*   ndarrayr   r0   r4   rM   sizer   repeat)	r   r   r   dc	shape_outr?   dim_innreps	            rA   r!   r!     s   HDk 	CA

3
Jq#++$>$> yyT;; IIad$a8	FF
AFF1Ho#8c!''3&788I	A1u-LFqyIIb!$++D!4LA . 99Y)  gs   D4 4EErE   )r   )A	functoolsr   numpy._core.numeric_corenumericr*   r   r   r   r   r   numpy._core.fromnumericr   r	   numpy._core.multiarrayr
   numpy._core._multiarray_umathr   numpy._corer   r   r   r   numpy._core.overridesr   numpy._core.shape_baser   numpy.lib._index_tricks_implr   numpy.matrixlib.defmatrixr   __all__partialarray_function_dispatchrB   rH   r"   rP   r#   rV   r   rq   r   rw   r   r   __doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r!   rF   rC   rA   <module>r     s`     ! ! M M 6 7 : ! * 4 , ? 0 , $++%%g7 . 45u? 6u?p" 34TA 5TAn 56I 7IX 45T 6Tn 01V 2Vt G + 5 5 NN	 - 12(& 3(&V- +,8$ -8$v& 015 25p& *+K7 ,K7\& -.C2 /C2L -.2. /2.j -.*. /*.Z0 )*oD +oDd )*Y  +Y rC   