
    Kh                         S r SSKrSSKrSSKJr  SSKrSSKJr  SSK	J
r
  \R                  " \R                  SS9r/ SQrS.S	 jr\" \5      S.S
 j5       rS r  S/SS.S jjr\" \5        S0SS.S jj5       r  S1SSSS.S jjr " S S\5      r " S S\5      r " S 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.S  jr\" \5      S2S! j5       r S3S" jr!\" \!5      S4S# j5       r"S.SS$.S% jjr#\" \#5      S2SS$.S& jj5       r$S2SS$.S' jjr%S.SS$.S( jjr&\" \&5      S2SS$.S) jj5       r'S* r(\" \(5      S+ 5       r)S3S, jr*\" \*5      S4S- j5       r+g)5a~  
Set operations for arrays based on sorting.

Notes
-----

For floating point arrays, inaccurate results may appear due to usual round-off
and floating point comparison issues.

Speed could be gained in some operations by an implementation of
`numpy.sort`, that can provide directly the permutation vectors, thus avoiding
calls to `numpy.argsort`.

Original author: Robert Cimrman

    N)
NamedTuple)	overrides)_array_converternumpy)module)ediff1din1dintersect1disin	setdiff1dsetxor1dunion1dunique
unique_allunique_countsunique_inverseunique_valuesc                 
    XU4$ N )aryto_endto_begins      M/var/www/html/env/lib/python3.13/site-packages/numpy/lib/_arraysetops_impl.py_ediff1d_dispatcherr   %   s    ""    c                    [        U 5      nUS   R                  5       n U R                  nUc  Uc  U SS U SS -
  $ Uc  SnOV[        R                  " U5      n[        R
                  " X$SS9(       d  [        S5      eUR                  5       n[        U5      nUc  SnOV[        R                  " U5      n[        R
                  " XSS9(       d  [        S5      eUR                  5       n[        U5      n[        [        U 5      S-
  S5      n[        R                  " XU-   U-   S	9nUS:  a  X(SU& US:  a  XXW-   S& [        R                  " U SS U SS XXW-    5        UR                  U5      $ )
a  
The differences between consecutive elements of an array.

Parameters
----------
ary : array_like
    If necessary, will be flattened before the differences are taken.
to_end : array_like, optional
    Number(s) to append at the end of the returned differences.
to_begin : array_like, optional
    Number(s) to prepend at the beginning of the returned differences.

Returns
-------
ediff1d : ndarray
    The differences. Loosely, this is ``ary.flat[1:] - ary.flat[:-1]``.

See Also
--------
diff, gradient

Notes
-----
When applied to masked arrays, this function drops the mask information
if the `to_begin` and/or `to_end` parameters are used.

Examples
--------
>>> import numpy as np
>>> x = np.array([1, 2, 4, 7, 0])
>>> np.ediff1d(x)
array([ 1,  2,  3, -7])

>>> np.ediff1d(x, to_begin=-99, to_end=np.array([88, 99]))
array([-99,   1,   2, ...,  -7,  88,  99])

The returned array is always 1D.

>>> y = [[1, 2, 4], [1, 6, 24]]
>>> np.ediff1d(y)
array([ 1,  2, -3,  5, 18])

r   N   	same_kind)castingzSdtype of `to_begin` must be compatible with input `ary` under the `same_kind` rule.zQdtype of `to_end` must be compatible with input `ary` under the `same_kind` rule.)shape)r   raveldtypenp
asanyarraycan_cast	TypeErrorlenmax
empty_likesubtractwrap)	r   r   r   conv	dtype_reql_beginl_endl_diffresults	            r   r   r   )   sw   Z C D
q'--/C 		I FN12wSb!!==*{{8D K L L >>#h-~v&{{6kB K L L F SAq!F]]3w&6&>?F{#xqy$*w !KKABSb6'2B#CD99Vr   c                 .    [        U 5      S:X  a  U S   $ U $ )z4Unpacks one-element tuples for use as return values r   r   )r)   xs    r   _unpack_tupler7      s    
1v{tr   )	equal_nanc                    U 4$ r   r   )arreturn_indexreturn_inversereturn_countsaxisr8   s         r   _unique_dispatcherr?      s	    5Lr   Tc          
      B  ^^^ [         R                  " U 5      n Tc!  [        XX#XPR                  SS9n[	        U5      $  [         R
                  " U TS5      n S/U R                  -  nU R                  S   UT'   U R                  U R                  smmU R                  TS   [         R                  " TSS [         R                  S95      n [         R                  " U 5      n [        U R                  S   5       Vs/ s H  nSR                  US9U R                  4PM      n	n U R                  S   S:  a  U R!                  U	5      n
O[         R"                  " [%        U 5      U	S9n
 UUU4S
 jn[        XX#XWTS9nU" US   5      4USS -   n[	        U5      $ ! [         R                  R                   a,    [         R                  R                  TU R                  5      Sef = fs  snf ! [&         a*  nSn['        UR                  U R                  S	95      UeSnAff = f)a  
Find the unique elements of an array.

Returns the sorted unique elements of an array. There are three optional
outputs in addition to the unique elements:

* the indices of the input array that give the unique values
* the indices of the unique array that reconstruct the input array
* the number of times each unique value comes up in the input array

Parameters
----------
ar : array_like
    Input array. Unless `axis` is specified, this will be flattened if it
    is not already 1-D.
return_index : bool, optional
    If True, also return the indices of `ar` (along the specified axis,
    if provided, or in the flattened array) that result in the unique array.
return_inverse : bool, optional
    If True, also return the indices of the unique array (for the specified
    axis, if provided) that can be used to reconstruct `ar`.
return_counts : bool, optional
    If True, also return the number of times each unique item appears
    in `ar`.
axis : int or None, optional
    The axis to operate on. If None, `ar` will be flattened. If an integer,
    the subarrays indexed by the given axis will be flattened and treated
    as the elements of a 1-D array with the dimension of the given axis,
    see the notes for more details.  Object arrays or structured arrays
    that contain objects are not supported if the `axis` kwarg is used. The
    default is None.

equal_nan : bool, optional
    If True, collapses multiple NaN values in the return array into one.

    .. versionadded:: 1.24

Returns
-------
unique : ndarray
    The sorted unique values.
unique_indices : ndarray, optional
    The indices of the first occurrences of the unique values in the
    original array. Only provided if `return_index` is True.
unique_inverse : ndarray, optional
    The indices to reconstruct the original array from the
    unique array. Only provided if `return_inverse` is True.
unique_counts : ndarray, optional
    The number of times each of the unique values comes up in the
    original array. Only provided if `return_counts` is True.

See Also
--------
repeat : Repeat elements of an array.
sort : Return a sorted copy of an array.

Notes
-----
When an axis is specified the subarrays indexed by the axis are sorted.
This is done by making the specified axis the first dimension of the array
(move the axis to the first dimension to keep the order of the other axes)
and then flattening the subarrays in C order. The flattened subarrays are
then viewed as a structured type with each element given a label, with the
effect that we end up with a 1-D array of structured types that can be
treated in the same way as any other 1-D array. The result is that the
flattened subarrays are sorted in lexicographic order starting with the
first element.

.. versionchanged:: 1.21
    Like np.sort, NaN will sort to the end of the values.
    For complex arrays all NaN values are considered equivalent
    (no matter whether the NaN is in the real or imaginary part).
    As the representant for the returned array the smallest one in the
    lexicographical order is chosen - see np.sort for how the lexicographical
    order is defined for complex arrays.

.. versionchanged:: 2.0
    For multi-dimensional inputs, ``unique_inverse`` is reshaped
    such that the input can be reconstructed using
    ``np.take(unique, unique_inverse, axis=axis)``. The result is
    now not 1-dimensional when ``axis=None``.

    Note that in NumPy 2.0.0 a higher dimensional array was returned also
    when ``axis`` was not ``None``.  This was reverted, but
    ``inverse.reshape(-1)`` can be used to ensure compatibility with both
    versions.

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

Return the unique rows of a 2D array

>>> a = np.array([[1, 0, 0], [1, 0, 0], [2, 3, 4]])
>>> np.unique(a, axis=0)
array([[1, 0, 0], [2, 3, 4]])

Return the indices of the original array that give the unique values:

>>> a = np.array(['a', 'b', 'b', 'c', 'a'])
>>> u, indices = np.unique(a, return_index=True)
>>> u
array(['a', 'b', 'c'], dtype='<U1')
>>> indices
array([0, 1, 3])
>>> a[indices]
array(['a', 'b', 'c'], dtype='<U1')

Reconstruct the input array from the unique values and inverse:

>>> a = np.array([1, 2, 6, 4, 2, 3, 2])
>>> u, indices = np.unique(a, return_inverse=True)
>>> u
array([1, 2, 3, 4, 6])
>>> indices
array([0, 1, 4, 3, 1, 2, 1])
>>> u[indices]
array([1, 2, 6, 4, 2, 3, 2])

Reconstruct the input values from the unique values and counts:

>>> a = np.array([1, 2, 6, 4, 2, 3, 2])
>>> values, counts = np.unique(a, return_counts=True)
>>> values
array([1, 2, 3, 4, 6])
>>> counts
array([1, 3, 1, 1, 1])
>>> np.repeat(values, counts)
array([1, 2, 2, 2, 3, 4, 6])    # original order not preserved

Nr8   inverse_shaper>   r   r   r$   zf{i})iz;The axis argument to unique is not supported for dtype {dt})dtc                    > [        U 5      nU R                  T5      n U R                  " U/TSS  Q76 n [        R                  " U ST5      n U $ )Nr   r   )r)   viewreshaper%   moveaxis)uniqnr>   
orig_dtype
orig_shapes     r   reshape_uniqunique.<locals>.reshape_uniqD  sJ    Iyy$||A/
12/{{4D)r   )r%   r&   	_unique1dr"   r7   rI   
exceptions	AxisErrorndimr$   rH   prodintpascontiguousarrayrangeformatrG   emptyr)   r(   )r:   r;   r<   r=   r>   r8   retrB   rD   r$   consolidatedemsgrN   outputrL   rM   s       `          @@r   r   r      s   V 
r	B|."+88$PS!!?[[T1% C"''MM((1+M$  XXrxxJ
	JqM277:ab>#I	JB			b	!B5:288A;5GH5Gfmmam "((+5GEH888A;?775>L 88CG59L |%!* "F 6!9%'&*4F  W =="" ?mm%%dBGG4$>? I   8K

bhh
/0a78s0   F ;%G%#$G* G* A
G"*
H4%HHrA   c                   [         R                  " U 5      R                  5       n U=(       d    UnU(       a  U R                  U(       a  SOSS9nX   n	OU R	                  5         U n	[         R
                  " U	R                  [         R                  S9n
SU
SS& U(       a  U	R                  S   S:  a  U	R                  R                  S	;   a  [         R                  " U	S
   5      (       a  U	R                  R                  S:X  a+  [         R                  " [         R                  " U	5      SSS9nO[         R                  " XS
   SS9nUS:  a  U	SU U	SUS-
   :g  U
SU& SX'   SXS-   S& OU	SS U	SS
 :g  U
SS& X   4nU(       a	  UWU
   4-  nU(       ac  [         R                  " U
5      S-
  n[         R
                  " U
R                  [         R                  S9nXW'   Xc  UR                  U5      OU4-  nU(       aS  [         R                  " [         R                   " U
5      U
R"                  /4-   5      nU[         R$                  " U5      4-  nU$ )z7
Find the unique elements of an array, ignoring shape.
	mergesort	quicksortkindrC   TNr   r   cfmMr   cleft)sideF)r%   r&   flattenargsortsortrY   r"   boolr$   rc   isnansearchsortedcumsumrU   rH   concatenatenonzerosizediff)r:   r;   r<   r=   r8   rB   r>   optional_indicespermauxmaskaux_firstnanrZ   imaskinv_idxidxs                   r   rP   rP   S  s    
r		"	"	$B#5~zzl{zLh
	88CIIRWW-DD!HciilQ&399>>V+CHHSW99>>S ??288C=$VLL??3BfEL!Al#s+<L1,<'== < !"'Aqr7c#2h&QR9,CT
}		$!#((4::RWW5,.GMMnnRZZ-$))>?Jr   c                       \ rS rSr% \R
                  \S'   \R
                  \S'   \R
                  \S'   \R
                  \S'   Srg)UniqueAllResulti  valuesindicesinverse_indicescountsr   N__name__
__module____qualname____firstlineno__r%   ndarray__annotations____static_attributes__r   r   r   r|   r|     s*    JJZZZZJJr   r|   c                   R    \ rS rSr% \R
                  \S'   \R
                  \S'   Srg)UniqueCountsResulti  r}   r   r   Nr   r   r   r   r   r     s    JJJJr   r   c                   R    \ rS rSr% \R
                  \S'   \R
                  \S'   Srg)UniqueInverseResulti  r}   r   r   Nr   r   r   r   r   r     s    JJZZr   r   c                    U 4$ r   r   r5   s    r   _unique_all_dispatcherr     	    4Kr   c                 ,    [        U SSSSS9n[        U6 $ )a  
Find the unique elements of an array, and counts, inverse, and indices.

This function is an Array API compatible alternative to::

    np.unique(x, return_index=True, return_inverse=True,
              return_counts=True, equal_nan=False)

but returns a namedtuple for easier access to each output.

Parameters
----------
x : array_like
    Input array. It will be flattened if it is not already 1-D.

Returns
-------
out : namedtuple
    The result containing:

    * values - The unique elements of an input array.
    * indices - The first occurring indices for each unique element.
    * inverse_indices - The indices from the set of unique elements
      that reconstruct `x`.
    * counts - The corresponding counts for each unique element.

See Also
--------
unique : Find the unique elements of an array.

Examples
--------
>>> import numpy as np
>>> x = [1, 1, 2]
>>> uniq = np.unique_all(x)
>>> uniq.values
array([1, 2])
>>> uniq.indices
array([0, 2])
>>> uniq.inverse_indices
array([0, 0, 1])
>>> uniq.counts
array([2, 1])
TFr;   r<   r=   r8   )r   r|   r6   r3   s     r   r   r     s+    \ 	F F##r   c                    U 4$ r   r   r5   s    r   _unique_counts_dispatcherr     r   r   c                 ,    [        U SSSSS9n[        U6 $ )a  
Find the unique elements and counts of an input array `x`.

This function is an Array API compatible alternative to::

    np.unique(x, return_counts=True, equal_nan=False)

but returns a namedtuple for easier access to each output.

Parameters
----------
x : array_like
    Input array. It will be flattened if it is not already 1-D.

Returns
-------
out : namedtuple
    The result containing:

    * values - The unique elements of an input array.
    * counts - The corresponding counts for each unique element.

See Also
--------
unique : Find the unique elements of an array.

Examples
--------
>>> import numpy as np
>>> x = [1, 1, 2]
>>> uniq = np.unique_counts(x)
>>> uniq.values
array([1, 2])
>>> uniq.counts
array([2, 1])
FTr   )r   r   r   s     r   r   r     s+    L 	F v&&r   c                    U 4$ r   r   r5   s    r   _unique_inverse_dispatcherr     r   r   c                 ,    [        U SSSSS9n[        U6 $ )a  
Find the unique elements of `x` and indices to reconstruct `x`.

This function is an Array API compatible alternative to::

    np.unique(x, return_inverse=True, equal_nan=False)

but returns a namedtuple for easier access to each output.

Parameters
----------
x : array_like
    Input array. It will be flattened if it is not already 1-D.

Returns
-------
out : namedtuple
    The result containing:

    * values - The unique elements of an input array.
    * inverse_indices - The indices from the set of unique elements
      that reconstruct `x`.

See Also
--------
unique : Find the unique elements of an array.

Examples
--------
>>> import numpy as np
>>> x = [1, 1, 2]
>>> uniq = np.unique_inverse(x)
>>> uniq.values
array([1, 2])
>>> uniq.inverse_indices
array([0, 0, 1])
FTr   )r   r   r   s     r   r   r     s+    N 	F ''r   c                    U 4$ r   r   r5   s    r   _unique_values_dispatcherr   9  r   r   c                     [        U SSSSS9$ )a  
Returns the unique elements of an input array `x`.

This function is an Array API compatible alternative to::

    np.unique(x, equal_nan=False)

Parameters
----------
x : array_like
    Input array. It will be flattened if it is not already 1-D.

Returns
-------
out : ndarray
    The unique elements of an input array.

See Also
--------
unique : Find the unique elements of an array.

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

Fr   )r   r5   s    r   r   r   =  s     < 	 r   c                     X4$ r   r   )ar1ar2assume_uniquereturn_indicess       r   _intersect1d_dispatcherr   d  
    :r   c                 B   [         R                  " U 5      n [         R                  " U5      nU(       d7  U(       a  [        U SS9u  p[        USS9u  pO7[        U 5      n [        U5      nO U R                  5       n UR                  5       n[         R                  " X45      nU(       a  [         R
                  " USS9nXg   nOUR                  5         USS USS :H  nUSS U   n	U(       a2  WSS U   n
USS U   U R                  -
  nU(       d
  WU
   n
WU   nXU4$ U	$ )a  
Find the intersection of two arrays.

Return the sorted, unique values that are in both of the input arrays.

Parameters
----------
ar1, ar2 : array_like
    Input arrays. Will be flattened if not already 1D.
assume_unique : bool
    If True, the input arrays are both assumed to be unique, which
    can speed up the calculation.  If True but ``ar1`` or ``ar2`` are not
    unique, incorrect results and out-of-bounds indices could result.
    Default is False.
return_indices : bool
    If True, the indices which correspond to the intersection of the two
    arrays are returned. The first instance of a value is used if there are
    multiple. Default is False.

Returns
-------
intersect1d : ndarray
    Sorted 1D array of common and unique elements.
comm1 : ndarray
    The indices of the first occurrences of the common values in `ar1`.
    Only provided if `return_indices` is True.
comm2 : ndarray
    The indices of the first occurrences of the common values in `ar2`.
    Only provided if `return_indices` is True.

Examples
--------
>>> import numpy as np
>>> np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1])
array([1, 3])

To intersect more than two arrays, use functools.reduce:

>>> from functools import reduce
>>> reduce(np.intersect1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))
array([3])

To return the indices of the values common to the input arrays
along with the intersected values:

>>> x = np.array([1, 1, 2, 3, 4])
>>> y = np.array([2, 1, 4, 6])
>>> xy, x_ind, y_ind = np.intersect1d(x, y, return_indices=True)
>>> x_ind, y_ind
(array([0, 2, 4]), array([1, 0, 2]))
>>> xy, x[x_ind], y[y_ind]
(array([1, 2, 4]), array([1, 2, 4]), array([1, 2, 4]))

T)r;   r`   rb   r   Nr   )r%   r&   r   r#   ro   ri   rj   rq   )r   r   r   r   ind1ind2ru   aux_sort_indicesrv   int1dar1_indicesar2_indicess               r   r
   r
   i  s   p --
C
--
Cs6ICs6IC+C+Ciikiik
..#
$C::c<#
qr7c#2hDHTNE&s+D1&qr*40388;{+K{+K;..r   c                     X4$ r   r   r   r   r   s      r   _setxor1d_dispatcherr     
    :r   c                    U(       d  [        U 5      n [        U5      n[        R                  " X4SS9nUR                  S:X  a  U$ UR	                  5         [        R                  " S/USS USS :g  S/45      nX4SS USS -     $ )a[  
Find the set exclusive-or of two arrays.

Return the sorted, unique values that are in only one (not both) of the
input arrays.

Parameters
----------
ar1, ar2 : array_like
    Input arrays.
assume_unique : bool
    If True, the input arrays are both assumed to be unique, which
    can speed up the calculation. Default is False.

Returns
-------
setxor1d : ndarray
    Sorted 1D array of unique values that are in only one of the input
    arrays.

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

Nr>   r   Tr   r   )r   r%   ro   rq   rj   )r   r   r   ru   flags        r   r   r     s    > SkSk
..#$
/C
xx1}
HHJ>>D63qr7c#2h#6?@DABx$s)#$$r   rb   c                    X4$ r   r   r   r   r   invertrc   s        r   _in1d_dispatcherr     r   r   c                L    [         R                  " S[        SS9  [        XX#US9$ )a  
Test whether each element of a 1-D array is also present in a second array.

.. deprecated:: 2.0
    Use :func:`isin` instead of `in1d` for new code.

Returns a boolean array the same length as `ar1` that is True
where an element of `ar1` is in `ar2` and False otherwise.

Parameters
----------
ar1 : (M,) array_like
    Input array.
ar2 : array_like
    The values against which to test each value of `ar1`.
assume_unique : bool, optional
    If True, the input arrays are both assumed to be unique, which
    can speed up the calculation.  Default is False.
invert : bool, optional
    If True, the values in the returned array are inverted (that is,
    False where an element of `ar1` is in `ar2` and True otherwise).
    Default is False. ``np.in1d(a, b, invert=True)`` is equivalent
    to (but is faster than) ``np.invert(in1d(a, b))``.
kind : {None, 'sort', 'table'}, optional
    The algorithm to use. This will not affect the final result,
    but will affect the speed and memory use. The default, None,
    will select automatically based on memory considerations.

    * If 'sort', will use a mergesort-based approach. This will have
      a memory usage of roughly 6 times the sum of the sizes of
      `ar1` and `ar2`, not accounting for size of dtypes.
    * If 'table', will use a lookup table approach similar
      to a counting sort. This is only available for boolean and
      integer arrays. This will have a memory usage of the
      size of `ar1` plus the max-min value of `ar2`. `assume_unique`
      has no effect when the 'table' option is used.
    * If None, will automatically choose 'table' if
      the required memory allocation is less than or equal to
      6 times the sum of the sizes of `ar1` and `ar2`,
      otherwise will use 'sort'. This is done to not use
      a large amount of memory by default, even though
      'table' may be faster in most cases. If 'table' is chosen,
      `assume_unique` will have no effect.

Returns
-------
in1d : (M,) ndarray, bool
    The values `ar1[in1d]` are in `ar2`.

See Also
--------
isin                  : Version of this function that preserves the
                        shape of ar1.

Notes
-----
`in1d` can be considered as an element-wise function version of the
python keyword `in`, for 1-D sequences. ``in1d(a, b)`` is roughly
equivalent to ``np.array([item in b for item in a])``.
However, this idea fails if `ar2` is a set, or similar (non-sequence)
container:  As ``ar2`` is converted to an array, in those cases
``asarray(ar2)`` is an object array rather than the expected array of
contained values.

Using ``kind='table'`` tends to be faster than `kind='sort'` if the
following relationship is true:
``log10(len(ar2)) > (log10(max(ar2)-min(ar2)) - 2.27) / 0.927``,
but may use greater memory. The default value for `kind` will
be automatically selected based only on memory usage, so one may
manually set ``kind='table'`` if memory constraints can be relaxed.

Examples
--------
>>> import numpy as np
>>> test = np.array([0, 1, 2, 5, 0])
>>> states = [0, 2]
>>> mask = np.in1d(test, states)
>>> mask
array([ True, False,  True, False,  True])
>>> test[mask]
array([0, 2, 0])
>>> mask = np.in1d(test, states, invert=True)
>>> mask
array([False,  True, False,  True, False])
>>> test[mask]
array([1, 5])
z,`in1d` is deprecated. Use `np.isin` instead.   )
stacklevelrb   )warningswarnDeprecationWarning_in1dr   s        r   r	   r	     s+    v MM6 =t<<r   c          	      	   [         R                  " U 5      R                  5       n [         R                  " U5      R                  5       nUR                  [        :X  a  UR                  SS5      nUS;  a  [        SU S35      e[        S X4 5       5      nU=(       a    US;   nU(       Ga  UR                  S:X  a9  U(       a  [         R                  " U [        S	9$ [         R                  " U [        S	9$ U R                  [        :X  a  U R                  [         R                  5      n UR                  [        :X  a  UR                  [         R                  5      n[        [         R                  " U5      5      n[        [         R                   " U5      5      nX-
  n	U	S
U R                  UR                  -   -  :*  n
U	[         R"                  " UR                  5      R                   :*  nU(       Ga*  U
(       d  US:X  Ga  U(       a  [         R                  " U [        S	9nO[         R                  " U [        S	9nU(       a$  [         R$                  " U	S-   [        S	9nSXU-
  '   O#[         R&                  " U	S-   [        S	9nSXU-
  '   X:*  X:  -  nX   nUR                  S:X  a  U$  [         R(                  " U[         R*                  S	9n[         R*                  n[         R.                  " U[         R*                  S	9nU[         R0                  " XUUSS9   X'   U$ US:X  a  [3        S5      eOUS:X  a  [        S5      eU R                  R4                  =(       d    UR                  R4                  n[7        U5      S[7        U 5      S-  -  :  d  U(       aq  U(       a5  [         R$                  " [7        U 5      [        S	9nU H  nUU U:g  -  nM     U$ [         R&                  " [7        U 5      [        S	9nU H  nUU U:H  -  nM     U$ U(       d.  [         R8                  " U SS9u  n n[         R8                  " U5      n[         R:                  " X45      nUR=                  SS9nUU   nU(       a  USS  US S :g  nOUSS  US S :H  n[         R:                  " UU/45      n[         R>                  " UR@                  [        S	9nUUU'   U(       a  US [7        U 5       $ UW   $ ! [,         a    UR                  n GNf = f)Nr   r   >   Nrj   tablezInvalid kind: 'z&'. Please use None, 'sort' or 'table'.c              3   R   #    U  H  oR                   R                  S ;   v   M     g7f))urD   bN)r$   rc   ).0r:   s     r   	<genexpr>_in1d.<locals>.<genexpr>l  s     N:R8:s   %'>   Nr   r   rC      r   unsafe)r$   outr!   zYou have specified kind='table', but the range of values in `ar2` or `ar1` exceed the maximum integer of the datatype. Please set `kind` to None or 'sort'.zjThe 'table' method is only supported for boolean or integer arrays. Please select 'sort' or None for kind.
   g(\?T)r<   r`   rb   )!r%   asarrayr#   r$   objectrH   
ValueErrorallrq   	ones_likerk   
zeros_likeastypeuint8intminr*   iinfooneszerosarrayrU   OverflowErrorr+   r,   RuntimeError	hasobjectr)   r   ro   ri   rY   r"   )r   r   r   r   rc   is_int_arraysuse_table_methodar2_minar2_max	ar2_rangebelow_memory_constraintrange_safe_from_overflowoutgoing_arrayisin_helper_ar
basic_maskin_range_ar1r$   r   contains_objectrv   arev_idxr:   ordersarbool_arr   rZ   s                               r   r   r   ^  s>   
**S/


!C
**S/


!C yyFkk"a **dV#IJL 	L NC:NNM$@)@88q=||Ct44}}S55 99**RXX&C99**RXX&CbffSk"bffSk"%	 #,qCHHsxx4G/H"H#,0C0G0G#G  %$ !#c!>!#s$!? !#Qd!C01W}-!#)a-t!D01W}- .S^<J?L  A%%%"((7"'': --BGG<C)7KKU$';*<N& "!W_7   
5
 	
 ii))@SYY-@-@O 3x"s3x5(((O773s840D"   88CHD1D"  yyT:Wiin	
	#B JJKJ(E
U)Cqr7c#2h&qr7c#2h&>>7VH-.D
((2884
(CCJ9CH~7|A ! "		"s   (3S! !S;:S;c                    X4$ r   r   elementtest_elementsr   r   rc   s        r   _isin_dispatcherr     s    ##r   c                v    [         R                  " U 5      n [        XUX4S9R                  U R                  5      $ )a  
Calculates ``element in test_elements``, broadcasting over `element` only.
Returns a boolean array of the same shape as `element` that is True
where an element of `element` is in `test_elements` and False otherwise.

Parameters
----------
element : array_like
    Input array.
test_elements : array_like
    The values against which to test each value of `element`.
    This argument is flattened if it is an array or array_like.
    See notes for behavior with non-array-like parameters.
assume_unique : bool, optional
    If True, the input arrays are both assumed to be unique, which
    can speed up the calculation.  Default is False.
invert : bool, optional
    If True, the values in the returned array are inverted, as if
    calculating `element not in test_elements`. Default is False.
    ``np.isin(a, b, invert=True)`` is equivalent to (but faster
    than) ``np.invert(np.isin(a, b))``.
kind : {None, 'sort', 'table'}, optional
    The algorithm to use. This will not affect the final result,
    but will affect the speed and memory use. The default, None,
    will select automatically based on memory considerations.

    * If 'sort', will use a mergesort-based approach. This will have
      a memory usage of roughly 6 times the sum of the sizes of
      `element` and `test_elements`, not accounting for size of dtypes.
    * If 'table', will use a lookup table approach similar
      to a counting sort. This is only available for boolean and
      integer arrays. This will have a memory usage of the
      size of `element` plus the max-min value of `test_elements`.
      `assume_unique` has no effect when the 'table' option is used.
    * If None, will automatically choose 'table' if
      the required memory allocation is less than or equal to
      6 times the sum of the sizes of `element` and `test_elements`,
      otherwise will use 'sort'. This is done to not use
      a large amount of memory by default, even though
      'table' may be faster in most cases. If 'table' is chosen,
      `assume_unique` will have no effect.


Returns
-------
isin : ndarray, bool
    Has the same shape as `element`. The values `element[isin]`
    are in `test_elements`.

Notes
-----
`isin` is an element-wise function version of the python keyword `in`.
``isin(a, b)`` is roughly equivalent to
``np.array([item in b for item in a])`` if `a` and `b` are 1-D sequences.

`element` and `test_elements` are converted to arrays if they are not
already. If `test_elements` is a set (or other non-sequence collection)
it will be converted to an object array with one element, rather than an
array of the values contained in `test_elements`. This is a consequence
of the `array` constructor's way of handling non-sequence collections.
Converting the set to a list usually gives the desired behavior.

Using ``kind='table'`` tends to be faster than `kind='sort'` if the
following relationship is true:
``log10(len(test_elements)) >
(log10(max(test_elements)-min(test_elements)) - 2.27) / 0.927``,
but may use greater memory. The default value for `kind` will
be automatically selected based only on memory usage, so one may
manually set ``kind='table'`` if memory constraints can be relaxed.

Examples
--------
>>> import numpy as np
>>> element = 2*np.arange(4).reshape((2, 2))
>>> element
array([[0, 2],
       [4, 6]])
>>> test_elements = [1, 2, 4, 8]
>>> mask = np.isin(element, test_elements)
>>> mask
array([[False,  True],
       [ True, False]])
>>> element[mask]
array([2, 4])

The indices of the matched values can be obtained with `nonzero`:

>>> np.nonzero(mask)
(array([0, 1]), array([1, 0]))

The test can also be inverted:

>>> mask = np.isin(element, test_elements, invert=True)
>>> mask
array([[ True, False],
       [False,  True]])
>>> element[mask]
array([0, 6])

Because of how `array` handles sets, the following does not
work as expected:

>>> test_set = {1, 2, 4, 8}
>>> np.isin(element, test_set)
array([[False, False],
       [False, False]])

Casting the set to a list gives the expected result:

>>> np.isin(element, list(test_set))
array([[False,  True],
       [ True, False]])
)r   r   rc   )r%   r   r   rH   r"   r   s        r   r   r     s6    h jj!G}++277==+ABr   c                     X4$ r   r   r   r   s     r   _union1d_dispatcherr   p  r   r   c                 @    [        [        R                  " X4SS95      $ )a`  
Find the union of two arrays.

Return the unique, sorted array of values that are in either of the two
input arrays.

Parameters
----------
ar1, ar2 : array_like
    Input arrays. They are flattened if they are not already 1D.

Returns
-------
union1d : ndarray
    Unique, sorted union of the input arrays.

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

To find the union of more than two arrays, use functools.reduce:

>>> from functools import reduce
>>> reduce(np.union1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))
array([1, 2, 3, 4, 6])
Nr   )r   r%   ro   r   s     r   r   r   t  s    < "..#$788r   c                     X4$ r   r   r   s      r   _setdiff1d_dispatcherr     r   r   c                     U(       a%  [         R                  " U 5      R                  5       n O[        U 5      n [        U5      nU [	        XSSS9   $ )a  
Find the set difference of two arrays.

Return the unique values in `ar1` that are not in `ar2`.

Parameters
----------
ar1 : array_like
    Input array.
ar2 : array_like
    Input comparison array.
assume_unique : bool
    If True, the input arrays are both assumed to be unique, which
    can speed up the calculation.  Default is False.

Returns
-------
setdiff1d : ndarray
    1D array of values in `ar1` that are not in `ar2`. The result
    is sorted when `assume_unique=False`, but otherwise only sorted
    if the input is sorted.

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

T)r   r   )r%   r   r#   r   r   r   s      r   r   r     sD    B jjo##%SkSkuST$?@@r   )NN)NNNN)FFFN)FFF)FFr   )F),__doc__	functoolsr   typingr   r   r%   numpy._corer   numpy._core._multiarray_umathr   partialarray_function_dispatch__all__r   r   r7   r?   r   rP   r|   r   r   r   r   r   r   r   r   r   r   r   r
   r   r   r   r	   r   r   r   r   r   r   r   r   r   r   <module>r      sj        ! : $++%%g7 # ,-W .Wt >B04CG
 +,27%)~!8<~! -~!B 6;!+04D+`j  
 *  
 /04$ 14$n 23,' 4,'^ 34-( 5-(` 23# 4#N 6:
 01X 2Xv -.(% /(%V
 )*`=d `= +`=FQt Qh$!$
 )*uBuB +uBp ,-9 .9@ ./%A 0%Ar   