
    IR-es                        d Z ddlZddlmZ ddlmZmZmZ g dZ	 e
            Z	 i Z	 i Z	  e
            Z	 ed ej        j        j	        D             z  Zeh ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej         ej!        ej"        ej#        ej$        ej%        ej&        ej'        ej(        ej)        ej*        ej+        ej,        ej-        ej.        ej/        ej0        ej1        ej2        ej3        ej4        ej5        ej6        ej7        ej8        ej9        ej:        ej;        ej<        ej=        ej>        ej?        ej@        ejA        ejB        ejC        ejD        ejE        ejF        ejG        z  ZejH        ejI        ejJ        ejK        ejL        ejM        ejN        ejO        ejP        ejQ        ejR        ejS        ejT        ejU        ejV        hZWeWejX        ejY        ejZ        ej[        ej\        ej]        ej^        ej_        ej`        eja        ejb        ejc        ejd        eje        ejf        ejg        ejh        eji        ejj        ejk        ejl        ejm        hz  ZWeWd ejn        jo        j	        D             z  ZWereWejp        ejq        hz  ZWeejr        ejs        ejt        hz  ZeeWz  Z ee          Zu ee          Zvd Zwevd	             Zxevd
             Zyevd             Zzevd             Z{evdLd            Z| euej}        ej~        ej        ej        ej        ej        h          d             Z euej        ej        ej        ej        ej        ej        h          d             Z euej        ej        h          d             Z euej        h          d             ZeudMd            ZevdNd            ZevdOd            ZevdOd            ZevdOd            ZevdOd            ZevdPd            Zevd             Zevd              ZevdQd"            Zevd#             Zevd$             ZevdRd%            Zerevd&             Zevd'             ZevdSd(            ZeudNd)            Zevd*             Zevdd+d,            ZeudNd-            ZevdNdd.d/            Zd0 ZdTd1ZevdUd2            Zd3 ZdUd4ZevdUd5            Zevd6             ZevdMd7            Zevd8             Zevd9             ZevdVd:            ZeudWd;            Zevd<             Zevd=             ZevdXd?            Zevd@             Z G dA dB          ZdYdEZevddddCdDej        ddddddDfdF            ZevdZdG            ZdddHdHdIZdJ Zejn        j        j	        D ]-Z ev ee           eee                     e            e<   .e	 edK  e
e                                           e
e                                          z  D                       z  Z	dS )[a  Helpers for letting numpy functions interact with Masked arrays.

The module supplies helper routines for numpy functions that propagate
masks appropriately., for use in the ``__array_function__``
implementation of `~astropy.utils.masked.MaskedNDArray`.  They are not
very useful on their own, but the ones with docstrings are included in
the documentation so that there is a place to find out how the mask is
interpreted.

    N)FunctionAssigner)NUMPY_LT_1_23NUMPY_LT_1_24NUMPY_LT_2_0)MASKED_SAFE_FUNCTIONSAPPLY_TO_BOTH_FUNCTIONSDISPATCHED_FUNCTIONSUNSUPPORTED_FUNCTIONSc                 @    h | ]}|d vt          t          |          S )>   putalenwherechooseresizesearchsortedgetattrnp).0names     Elib/python3.11/site-packages/astropy/utils/masked/function_helpers.py	<setcomp>r   O   s8       OOO BOOO    c                 8    h | ]}t          t          |          S  r   )r   
setopsnames     r   r   r      s/        *GB
  r   c                  ~    ddl m}  |j        |  \  }}t          d t	          ||          D                       }||fS )zSeparate out arguments into tuples of data and masks.

    An all-False mask is created if an argument does not have a mask.
       Maskedc              3   |   K   | ]7\  }}||n+t          j        t          j        |          t                    V  8d S N)r   zerosshapebool)r   dms      r   	<genexpr>z&_get_data_and_masks.<locals>.<genexpr>   sS        @D1Q]!d ; ;     r   )corer    _get_data_and_maskstuplezip)argsr    datamaskss       r   r*   r*      sk    
 ,&,d3KD%  HKDRWHXHX    E ;r   c                 j    t          j        | j        g|R i || j                                        d fS r"   )r   datetime_as_stringunmaskedmaskcopy)arrr-   kwargss      r   r1   r1      s7    !#,@@@@@@#(--//SWXXr   c                 h    t          j        | j                  | j                                        d fS r"   )r   sincr2   r3   r4   xs    r   r8   r8      s%    71:t33r   c                 h    t          j        | j                  | j                                        d fS r"   )r   	iscomplexr2   r3   r4   r9   s    r   r<   r<      s%    <
##QV[[]]D88r   c                 j    t          j        | j        g|R i || j                                        d fS r"   )r   unwrapr2   r3   r4   )pr-   r6   s      r   r>   r>      s5    9QZ1$111&1116;;==$FFr   T        c                 ~    t          j        | j        ||||          }|r|| j                                        d fn| S )N)r4   nanposinfneginf)r   
nan_to_numr2   r3   r4   )r:   r4   rB   rC   rD   r.   s         r   rE   rE      s?    =$CvVVVD*.5D!&++--&&A5r   )helpsc                 >    t          |           \  }}||z   ||z   |d fS r"   r*   )ar-   r6   r.   r3   s        r   masked_a_helperrJ      s,     %Q''JD$$;tVT11r   c                 >    t          |           \  }}||z   ||z   |d fS r"   rH   )r'   r-   r6   r.   r3   s        r   masked_m_helperrL      *    $Q''JD$$;tVT11r   c                 >    t          |           \  }}||z   ||z   |d fS r"   rH   )vr-   r6   r.   r3   s        r   masked_v_helperrP      rM   r   c                 >    t          |           \  }}||z   ||z   |d fS r"   rH   )arrayr-   r6   r.   r3   s        r   masked_arr_helperrS      s*    $U++JD$$;tVT11r   Fc                 P    t          |           \  }}||t          ||          dfS )a?  Broadcast array to the given shape.

    Like `numpy.broadcast_to`, and applied to both unmasked data and mask.
    Note that ``subok`` is taken to mean whether or not subclasses of
    the unmasked data and mask are allowed, i.e., for ``subok=False``,
    a `~astropy.utils.masked.MaskedNDArray` will be returned.
    )r$   subokNr*   dict)rR   r$   rU   r.   r3   s        r   broadcast_torX      s1     %U++JD$t%u555t;;r   c                     t           j                            t          j        |           t          j        |          |          S )N)out)r   multiplyouterravel)rI   brZ   s      r   r\   r\      s/    ;RXa[["(1++3???r   Kc                    t          j        | j        ||||          }|D|j        j        r$t           j                            |j                  nt          j        d          }t          j        | j        ||||          }||dfS )zReturn a new array with the same shape and type as a given array.

    Like `numpy.empty_like`, but will add an empty mask.
    dtypeorderrU   r$   N?)r   
empty_liker2   rb   namesmamake_mask_descrr3   )	prototyperb   rc   rU   r$   r2   r3   s          r   re   re      s     }%uE  H  ~#BE!!(.111# 	
 =e5U  D T4r   c                 H    t          j        | j        ||||          }|ddfS )zReturn an array of zeros with the same shape and type as a given array.

    Like `numpy.zeros_like`, but will add an all-false mask.
    ra   FN)r   
zeros_liker2   rI   rb   rc   rU   r$   r2   s         r   rk   rk     s6     }	
%uE  H UD  r   c                 H    t          j        | j        ||||          }|ddfS )zReturn an array of ones with the same shape and type as a given array.

    Like `numpy.ones_like`, but will add an all-false mask.
    ra   FN)r   	ones_liker2   rl   s         r   rn   rn     s6     |	
%uE  H UD  r   c                 B    t          j        | ||||          }||d<   |S )zReturn a full array with the same shape and type as a given array.

    Like `numpy.full_like`, but with a mask that is also set.
    If ``fill_value`` is `numpy.ma.masked`, the data will be left unset
    (i.e., as created by `numpy.empty_like`).
    ra   .)r   re   )rI   
fill_valuerb   rc   rU   r$   results          r   	full_likerr   *  s,     ]1Ee5QQQFF3KMr   raisec                    ddl m} t          ||          st          | |          st          |                     |          \  }}|t          j        | j        |||           t          j        | j        |||           dS )zReplaces specified elements of an array with given values.

    Like `numpy.put`, but for masked array ``a`` and possibly masked
    value ``v``.  Masked indices ``ind`` are not supported.
    r   r   N)mode)	astropy.utils.maskedr    
isinstanceNotImplementedError_get_data_and_maskr   r   r2   r3   )rI   indrO   ru   r    v_datav_masks          r   r   r   7  s     ,+++++#v "jF&;&; "!!))!,,NFF
qz3T2222F163T******r   c                     ddl m} t          ||          st          | |          st          |                     |          \  }}|t          j        | j        ||           t          j        | j        ||           dS )zChanges elements of an array based on conditional and input values.

    Like `numpy.putmask`, but for masked array ``a`` and possibly masked
    ``values``.  Masked ``mask`` is not supported.
    r   r   N)	rv   r    rw   rx   ry   r   putmaskr2   r3   )rI   r3   valuesr    values_datavalues_masks         r   r~   r~   J  s     ,+++++$ "z!V'<'< "!! 33F;;K

1:t[111Jqvt[)))))r   c                     ddl m} t          ||          st          | |          st          |                     |          \  }}|t          j        | j        ||           t          j        | j        ||           dS )zChange elements of an array based on conditional and input values.

    Like `numpy.place`, but for masked array ``a`` and possibly masked
    ``values``.  Masked ``mask`` is not supported.
    r   r   N)	rv   r    rw   rx   ry   r   placer2   r3   )r5   r3   valsr    	vals_data	vals_masks         r   r   r   \  s     ,+++++$ "z#v'>'> "!!11$77Iy
tY///HSXtY'''''r   	same_kindc                    ddl m} t          | |          rt          ||          rt          |                     |          \  }}|t          j        | j        |||           |t          j        | j        ||           dS dS )zCopies values from one array to another, broadcasting as necessary.

    Like `numpy.copyto`, but for masked destination ``dst`` and possibly
    masked source ``src``.
    r   r   N)castingr   )r   )	rv   r    rw   rx   ry   r   copytor2   r3   )dstsrcr   r   r    src_datasrc_masks          r   r   r   n  s     ,+++++c6"" "j&?&? "!!//44Hh
	#,'GGGG
	#(HE222222 r   c                     t          j        | j        g|R i |}t          j        | j        g|R i |                    t
                    }||d fS r"   )r   packbitsr2   r3   astyper%   rI   r-   r6   rq   r3   s        r   r   r     s_    [5d555f55F;qv//////66t<<D4r   c                     t          j        | j        g|R i |}t          j        | j        d          }d|| j        <   t          j        |g|R i |                    t                    }||d fS )Nu1rb      )r   
unpackbitsr2   r#   r$   r3   r   r%   r   s        r   r   r     s~    ]1:777777F8AG4(((DDL=//////66t<<D4r   c                    ddl m} |t          j        |          }t	          | |          r>| j        dk    r3||j        | j        k    r|| j                  }| j        | j                  } d}|a|                    |          \  }}|Gt          j	        | |
                    t                    |          
                    t                    }t          j	        | |d          }||dfS )zCount number of occurrences of each value in array of non-negative ints.

    Like `numpy.bincount`, but masked entries in ``x`` will be skipped.
    Any masked entries in ``weights`` will lead the corresponding bin to
    be masked.
    r   r   Nr   )	minlength)rv   r    r   
asanyarrayrw   ndimr3   r2   ry   bincountr   intr%   )r:   weightsr   r    r3   w_maskrq   s          r   r   r     s     ,+++++-((!V  17<16#9#9qvg&GJwD 33G<<;q&--"4"4	JJJQQRVWWD[Gq111F4r   c                 Z    |                                  }|                    d           |S )Nr   axis)r4   sort)rI   rq   s     r   msortr     s(    r   c                 X   |                                  }|                                 t          |j        j        t
          j                  s]|j        j        dv r|                    d          S |j        j        dk    r|                    d          S |                    d          S |S )NbhBHFgGD)	r4   r   
issubclassrb   typer   complexfloatingcharr   )rI   r^   s     r   sort_complexr     s     	
AFFHHHaglB$677 7<6!!88C== W\S  88C== 88C== r   c                 .   t          |  \  }}|/t          j        ||||          t          j        ||          d fS ddlm} t          ||          st          t          j        ||j        |           t          j        ||j        |||           |S )N)r   rb   r   r   r   r   )rZ   r   )rZ   r   rb   r   )	r*   r   concatenaterv   r    rw   rx   r3   r2   )arraysr   rZ   rb   r   r.   r/   r    s           r   r   r     s    %v.KD%
{N4d%IIIN5t,,,
 	
 	0/////#v&& 	&%%
u#(6666
tDwWWWW
r   c                 P    t          | |          \  }}||t          |          d fS )Nr   rV   )r5   r   r   r.   r/   s        r   appendr     s,    %c622KD%$--r   c                    ddl m} t          j        j                            |           \  } }}}t          j        j                            | ||          \  }}} t          j        d | D              }t          d | D                       }t          d | D                       }	|r|	sdnd}
 |t          j	        |||
                    }t          ||           D ]\  }}||t          f|z   <   |S )	Nr   r   c                     g | ]	}|j         
S r   r   r   r5   s     r   
<listcomp>zblock.<locals>.<listcomp>  s    9993SY999r   c              3   0   K   | ]}|j         d          V  dS )F_CONTIGUOUSNflagsr   s     r   r(   zblock.<locals>.<genexpr>  )      >>#)N+>>>>>>r   c              3   0   K   | ]}|j         d          V  dS )C_CONTIGUOUSNr   r   s     r   r(   zblock.<locals>.<genexpr>  r   r   r   C)r$   rb   rc   )rv   r    r   r)   
shape_base_block_setup_block_info_recursionresult_typeallemptyr,   Ellipsis)r   r    	list_ndimresult_ndim
final_sizer$   slicesrb   F_orderC_orderrc   rq   	the_slicer5   s                 r   blockr     s    ,+++++131C1P1PQW1X1X.FI{JG.DD	; E66 N99&999:E>>v>>>>>G>>v>>>>>G373CCEVBH5UCCCDDFff-- . .	3*-{Y&''Mr   rU   c                     ddl m fd|D             }d t          ||          D             }t          j        |d i}t          |t                    r|d         j        n|j         fdt          ||          D             }fdt          ||          D             }t          |          dk    r|n|d         S )	aI  Broadcast arrays to a common shape.

    Like `numpy.broadcast_arrays`, applied to both unmasked data and masks.
    Note that ``subok`` is taken to mean whether or not subclasses of
    the unmasked data and masks are allowed, i.e., for ``subok=False``,
    `~astropy.utils.masked.MaskedNDArray` instances will be returned.
    r   r   c                 0    g | ]}t          |          S r   )rw   )r   argr    s     r   r   z$broadcast_arrays.<locals>.<listcomp>  s#    :::c*S&)):::r   c                 *    g | ]\  }}|r|j         n|S r   )r2   )r   r   	is_maskeds      r   r   z$broadcast_arrays.<locals>.<listcomp>  s4       1?i	+  r   rU   r   c                 V    g | ]%\  }}|rt          j        |j                   nd&S )r   N)r   rX   r3   )r   r   r   r$   rU   s      r   r   z$broadcast_arrays.<locals>.<listcomp>	  sK       C ;D	M5	6	6	6	6  r   c                 6    g | ]\  }}| ||          n|S r"   r   )r   rq   r3   r    s      r   r   z$broadcast_arrays.<locals>.<listcomp>  sC       VT "&!1			v  r   )	r)   r    r,   r   broadcast_arraysrw   listr$   len)rU   r-   
are_maskedr.   resultsr/   r    r$   s   `     @@r   r   r     s    ::::T:::J CFtZCXCX  D !45u55G *7D 9 9LGAJw}E    !$
33  E   !'511  G 'llQ&&77GAJ6r   c                     ddl m} t          ||          st          | |          st          t	          | |          \  \  }}\  }}||||f||||fi dfS )zInsert values along the given axis before the given indices.

    Like `numpy.insert` but for possibly masked ``arr`` and ``values``.
    Masked ``obj`` is not supported.
    r   r   N)rv   r    rw   rx   r*   )	r5   objr   r   r    arr_dataval_dataarr_maskval_masks	            r   insertr     s     ,+++++#v "jf&=&= "!!1DS&1Q1Q.Xx.8XsHd+hXt-LbRVWWr   keepdimsc                    |                      t          j        d| j                            }t          j        |||          S )zCounts the number of non-zero values in the array ``a``.

    Like `numpy.count_nonzero`, with masked values counted as 0 or `False`.
    r   r   )filledr   r#   rb   count_nonzero)rI   r   r   r   s       r   r   r   $  s;     XXbhr17++,,FFD8<<<<r   c                     | j         | j                  }|j        r)|                     t	          j        ||                    S |                     t	          j        | j         d          d         d          S )N)overwrite_input)r   r$   r   Tr3   )r2   r3   sizefrom_unmaskedr   medianrk   )rI   r   r2   s      r   _masked_median_1dr   .  sj    z16'"H} Try?SSSTTTr}QZtDDDQGdSSSr   c                     || j         dk    r%|                                 }t          ||          }nt          j        t          || |          }|||d<   |S )Nr   .)r   r]   r   r   apply_along_axis)rI   r   rZ   r   partrq   s         r   _masked_medianr   7  sY    |qv{{wwyy"499$%6aQQ
CMr   c                 d   ddl m} |t          ||          st           ||           } t          r[|                    dd          }t          j        j        j	        | ft          ||d|\  }}||r|                    |          n|n|S t          j        j        j	        | ft          ||d|S )Nr   r   r   F)funcr   rZ   )rv   r    rw   rx   r   popr   libfunction_base_ureducer   reshape)rI   r   rZ   r6   r    r   rks           r   r   r   C  s    ++++++
z#v66!!q		A 

::j%00v#,
"3
 
:@
 
1 58K/		!aaSH v#,
"3
 
:@
 
 	
r   c                    | j         | j                  }|j        r2t          j        j        j        ||fi |}|                     |          S |                     t          j        | j         |j	                  d          S )zx
    Private function for rank 1 arrays. Compute quantile ignoring NaNs.
    See nanpercentile for parameter usage.
    r   T)
r2   r3   r   r   r   r   _quantile_uncheckedr   rk   r$   )rI   qr6   r2   rq   s        r   _masked_quantile_1dr  Y  sw    
 z16'"H} O%9(APPPPv&&&r}QZqwGGGNNNr   c                     || j         dk    r#|                                 }t          ||fi |}n;t          j        t          || |fi |}|j         dk    rt          j        ||d          }|||d<   |S )Nr   r   .)r   r]   r  r   r   moveaxis)rI   r   r   rZ   r6   r   rq   s          r   _masked_quantiler  f  s    |qv{{wwyy$T17777$%8$1OOOO 6Q;;[q11F
CMr   c                 &   ddl m} t          ||          s|t          ||          st           ||           } t	          j        |          }t          j        j                            |          st          d          t          rd|                    dd          }t	          j        j        j        | ft          |||d|\  }}|!|r|                    |j        |z             n|n|S t	          j        j        j        | ft          |||d|S )Nr   r   z%Quantiles must be in the range [0, 1]r   F)r   r   r   rZ   )rv   r    rw   rx   r   r   r   r   _quantile_is_valid
ValueErrorr   r   r   r  r   r$   )	rI   r   r   rZ   r6   r    r   r   r   s	            r   quantiler  x  s>   ++++++!V "
38O8O!!q		A
aA622155 B@AAA 	
::j%00v#,
$#
 
AG
 
1 ?Bk(9		!'A+&&&sRv#,
$#
 
AG
 
 	
r   c                 N    t          j        |d          }t          | |g|R i |S )Nd   )r   true_divider  )rI   r   r-   r6   s       r   
percentiler    s3    
q#AAq*4***6***r   c                    t          | |          \  \  }}\  }}|j        |j        k    rdS ||k    }|r,|t          j        |          t          j        |          z  z  }t	          ||z  |z                                            S )NF)r*   r$   r   isnanr%   r   )a1a2	equal_nana1da2da1ma2mequals           r   array_equalr    s    0R88JS#
c
yCIu3JE /##..s"''))***r   c                 L    t          | |k                                              S r"   )r%   r   )r  r  s     r   array_equivr    s    r  !!!r   c                     ddl m} |s|                                 d d fS |                    |           \  } }t	          | \  }}t          j        | g|R  }t          j        | g|R  }|||z  } |||          S )Nr   r   r   )rv   r    nonzerory   r*   r   r   )	conditionr-   r    c_maskr.   r/   r2   r3   s           r   r   r     s    ++++++ /  ""D$..11)<<Iv%t,KD%x	)D)))H8I&&&&D6(&&&&r   c                 r   ddl m} |                    |           \  }}||dk    r|                     d          }d|i}|!t	          ||          st
          |j        |d<   t          | \  }}	t          j	        ||fi |}
|
|j
        |d<   t          j	        ||	fi |}|||z  }| ||
|          n|S )aA  Construct an array from an index array and a set of arrays to choose from.

    Like `numpy.choose`.  Masked indices in ``a`` will lead to masked output
    values and underlying data values are ignored if out of bounds (for
    ``mode='raise'``).  Any values masked in ``choices`` will be propagated
    if chosen.

    r   r   Nrs   )rp   ru   rZ   )rv   r    ry   r   rw   rx   r2   r*   r   r   r3   )rI   choicesrZ   ru   r    a_dataa_maskr6   r.   r/   data_chosenmask_chosens               r   r   r     s     ,+++++..q11NFFdgooQ''d^F
#v&& 	&%%u%w/KD%)FD33F33K
u)FE44V44Kv/2{66+{+++Cr   c                     ddl m fd| D             } t          | \  }}|t          j        j        ur |          n dd          }| ||j        f| ||j        fi dfS )zReturn an array drawn from elements in choicelist, depending on conditions.

    Like `numpy.select`, with masks in ``choicelist`` are propagated.
    Any masks in ``condlist`` are ignored.

    r   r   c                 B    g | ]}t          |          r|j        n|S r   )rw   r2   )r   cr    s     r   r   zselect.<locals>.<listcomp>  s.    MMMqjF33:

MMMr   Tr   N)rv   r    r*   r   rg   maskedr2   r3   )condlist
choicelistdefault	data_list	mask_listr    s        @r   selectr-    s     ,+++++MMMMHMMMH.
;Iy!(!<!<ffWooo&&QUBVBVBVG	9g./	9gl+
	 r   c           	         t          |          }t          j        |          s2t          |d         t          t          j        f          s| j        dk    r|g}t          j        |t                    }t          |          }||dz
  k    r6t          j	        |dd           }t          j
        ||gd          }|dz  }n"||k    rt          d| d| d	|dz    d
          t          j        |           }g }	g }
t          |          D ]}||         }t          |          s1|	                    ||                    |
                    |           J| ||                  }|j        dk    r:|	                    ||                    |
                     ||g|R i |           t#          |	|
          D ]
\  }}|||<   |S )zEvaluate a piecewise-defined function.

    Like `numpy.piecewise` but for masked input array ``x``.
    Any masks in ``condlist`` are ignored.

    r   r   r   T)r   r   r   zwith z condition(s), either z or z functions are expected)r   r   isscalarrw   r   ndarrayr   rR   r%   anyr   r  rk   rangecallabler   r   r,   )r:   r(  funclistr-   kwn2ncondelseyr   whatr   itemr   values                  r   	piecewiser=    s    
XB	{8 x{T2:$677<=FaKK:x---HHABF{{F8!d;;;;>8X"6Q???	Q	
bRARRQRRAERRR
 
 	

 	aAED1XX 	5 	5{~~ 	5LL!%%%KKXa[>Dy1}}Xa[)))DD3333334445$''  e$Hr   c                    ddl m} |                    |           \  }}t          ||          st          ||          rJt	          ||          \  \  }}\  }}	|j        |j        cxk    rdk    rn n||	z  }
||
          }||
          }t          j        |||g|R i |}||n |||                                          S )zOne-dimensional linear interpolation.

    Like `numpy.interp`, but any masked points in ``xp`` and ``fp``
    are ignored.  Any masked values in ``x`` will still be evaluated,
    but masked on output.
    r   r   r   )	rv   r    ry   rw   r*   r   r   interpr4   )r:   xpfpr-   r6   r    xdxmxpmfpmr'   rq   s               r   r?  r?  #  s     ,+++++&&q))FB"f B!7!7 22r::R*37bg"""""""""c	AQBBQBBYr2r3D333F33FZ66VVFBGGII%>%>>r   c                 b   ddl m} g }| D ]}t          ||          rh|j        }|rB|j                                        r)|                                }|j        d         ||j        <   |                    ||j        g           z|	                    |           t          j        ||          S )zPerform an indirect stable sort using a sequence of keys.

    Like `numpy.lexsort` but for possibly masked ``keys``.  Masked
    values are sorted towards the end for each key.
    r   r   r   r   )r)   r    rw   r2   r3   r1  r4   flatextendr   r   lexsort)keysr   r    new_keyskeynew_keys         r   rJ  rJ  :  s     H 
! 
!c6"" 		! lG 4CHLLNN 4!,,..$+LO!OOWch/0000OOC    :hT****r   c                    |}|j         }t          j        |          j         dk    r|f}|D ]_}|dk     r||z   }||f} | | }|j         |j         k    r|})t          j        ||          }|j         |j         k    r|}Qt	          d          |S )Nr   z7function is not returning an array of the correct shape)r   r   rR   expand_dimsr  )r   rI   axesvalNr   r-   ress           r   apply_over_axesrU  T  s     C	A	x~~aw  !88t8DT{dDk8sxCC.d++Cx38## M   Jr   c                   4    e Zd ZdZd Zd Zed             ZdS )MaskedFormatzFormatter for masked array scalars.

    For use in `numpy.array2string`, wrapping the regular formatters such
    that if a value is masked, its formatted string is replaced.

    Typically initialized using the ``from_data`` class method.
    c                     || _         t          |dd           }|rd |D             | j         _        t          |dd           }|rt          |          | j         _         d S d S )Nformat_functionsc                 ,    g | ]}t          |          S r   )rW  )r   ffs     r   r   z)MaskedFormat.__init__.<locals>.<listcomp>  s     4T4T4T"\"5E5E4T4T4Tr   format_function)r\  r   rY  rW  )selfr\  ffsr[  s       r   __init__zMaskedFormat.__init__z  s    . o'94@@ 	U4T4TPS4T4T4TD 1_&7>> 	D3?3C3CD 000	D 	Dr   c           	         j         j        r+|                     fdj         j        D                       S j        r|                               S |                     j        d                   }j        rFt          dt          dt          |                              }dt          |          |z
  z  d|z  z   S |S )Nc                      g | ]
}|         S r   r   )r   fieldr:   s     r   r   z)MaskedFormat.__call__.<locals>.<listcomp>  s    (M(M(Me5(M(M(Mr   r      r    u   —)	rb   rf   r\  r$   r2   r3   minmaxr   )r]  r:   stringr7  s    `  r   __call__zMaskedFormat.__call__  s    7= 	O ''(M(M(M(Mqw}(M(M(MNNN7 	+ ''*** %%ajn556 	
 As1c&kk**++A#f++/*X\99Mr   c                 2    ddl m}  |  ||fi |          S )Nr   )_get_format_function)numpy.core.arrayprintrj  )clsr.   optionsrj  s       r   	from_datazMaskedFormat.from_data  s8    >>>>>>s''8888999r   N)__name__
__module____qualname____doc__r_  rh  classmethodrn  r   r   r   rW  rW  q  sZ         D D D  2 : : [: : :r   rW  rd   c                 (   ddl m}m} t          j        |           }| j        |d         k    rd} |||d                   }nd}t          j        |fi |}d}	|	dt          |          z  z  }	 || ||d         |	||d         ||d	                   }
|
S )
Nr   )_formatArray_leading_trailing	thresholdz...	edgeitemsrt  rd  	linewidthlegacy)	rk  rv  rw  r   asarrayr   rW  rn  r   )rI   rm  	separatorprefixrv  rw  r.   summary_insertr\  next_line_prefixlsts              r   _array2stringr    s     FEEEEEEE:a==Dv$$$  w{';<< #,T==W==O c&kk))
,		 	C Jr   c                    ddl m}m}  ||||	||d d |
||
  
        }|                                }|                    |           |dxx         t          |          z  cc<   | j        dk    rdS t          | |||          S )Nr   )_format_options_make_options_dictrz  z[])rk  r  r  r4   updater   r   r  )rI   max_line_width	precisionsuppress_smallr}  r~  style	formatterrx  ry  sign	floatmodesuffixr  r  	overridesrm  s                    r   array2stringr    s    " JIIIIIII"" I ""$$GNN9KCKK' 	v{{tGY777r   c                 *    t          | |||dd          S )Nrd  rt  )r  )rI   r  r  r  s       r   	array_strr    s     >9nc2NNNr   r   )nansum	nancumsumnanprod
nancumprodc                     t          t          | dd                    t                              | d           fd}d|  d}
|d dz  }nd| v r|dz  }n|d	z  }||_        | |_        |S )
Nrc  c                 $   ddl m} |                    |           \  } }t          | j        j        t          j                  rt          j        |           }||n||z  }|# || |          } | 	                              }  | g|R i |S )Nr   r   )
rv   r    ry   r   rb   r   r   inexactr  r   )rI   r-   r6   r    r3   nansrp   np_funcs         r   nanfunczmasked_nanfunc.<locals>.nanfunc  s    //////++A..4aglBJ// 	;8A;;D<44dTkDq$A%HHZ((wq*4***6***r   zLike `numpy.z$`, skipping masked values as well.

z$Masked/NaN values are replaced with z. The output is not masked.r   zRNo exceptions are raised for fully masked/NaN slices.
Instead, these give index 0.zZNo warnings are given for fully masked/NaN slices.
Instead, they are masked in the output.)r   r   _nanfunc_fill_valuesgetrr  ro  )nanfuncnamer  docrp   r  s      @@r   masked_nanfuncr    s    b+abb/**G%))+t<<J+ + + + + + M
L
L
LC(: ( ( (	
 
+		+	

 	6	

 GO"GNr   c              #   2   K   | ]}|j         	|j        V  d S r"   )rr  ro  )r   helpers     r   r(   r(   5  sB         ~
O     r   )Tr@   NN)Fr"   )Nr_   TN)rs   )r   T)Nr   )r   NNr   )NNF)NN)Nrs   )r   )rF  )rd  rt  )NNN)rr  numpyr   .astropy.units.quantity_helper.function_helpersr   astropy.utils.compatr   r   r   __all__setr   r   r	   r
   r)   fromnumericmay_share_memorycan_castmin_scalar_typer   shares_memory
array_reprlinspacelogspace	geomspaceiscloseallcloseflatnonzeroargwhere
atleast_1d
atleast_2d
atleast_3dstackhstackvstackaveragediffextractmeshgridtrapzgradientdiag_indices_fromtriu_indices_fromtril_indices_fromfill_diagonalcolumn_stack	row_stackdstackarray_splitsplithsplitvsplitdsplitrP  r   krontiletake_along_axisput_along_axisiscomplexobj	isrealobjimagisrealrealreal_if_closecommon_typefixisneginfisposinfanglei0savesavezsavetxtsavez_compressedpolypolyaddpolyderpolydivpolyfitpolyintpolymulpolysubpolyvalrootsvanderIGNORED_FUNCTIONSpadr   digitize	is_busdaybusday_countbusday_offsetcovcorrcoef
trim_zeros	correlateconvolve	histogramhistogram2dhistogramddhistogram_bin_edgesdotvdotinner	tensordotcrosseinsumeinsum_pathr   arraysetopsasscalarr   unravel_indexravel_multi_indexix_apply_to_bothdispatched_functionr*   r1   r8   r<   r>   rE   r4   asfarrayr   r  rollaxisrollrJ   flipflipudfliplrrot90triutrilrL   diagdiagflatrP   deleterS   rX   r\   re   rk   rn   rr   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-  r=  r?  rJ  rU  rW  r  _NoValuer  r  r  r  nanfunctionsr  r   globalssortedr   r   r   r   <module>r     s  	 	     K K K K K K K K K K K K K K K K
      .  	     #+    
  &(&8:<. 
 M K  !l J   ^ .0[ M = #%- 24 <>9 GIi J   &([ 35( =?K  . 130D  !$ O%$ \%$ $&9%& N'& H'& !i'& *,'& 57I'( N)( ')( *,)( 35')* +* )+. O/. \/. $&7/. -/I/. 8:w/0 10 n14 F54 K54 58 H98 e9  @ GRXrz2#6GRZRZRZJ
BJ")  FBOR[L"/2#3FBKL"+L"."."2HFBGRXr|RXIr~     .0f.@.H    
  

  F   * *  ! !899&&';<<    Y Y Y 4 4 4 9 9 9 G G G 6 6 6 6 7BKBKbg
N  2 2 2
 bgry")RXrwPQQQ2 2 RQ2
 bgr{+,,,2 2 -,2
 bi[!!!2 2 "!2
 	< 	< 	< 	< @ @ @ @        * ! ! ! ! ! ! ! ! 	 	 	 	 + + + +$ * * *" ( ( (" 3 3 3 3&          2           $ . . . .
   0 "& 7 7 7 7 78 X X X X =E = = = = =T T T	 	 	 	 
 
 
 
*
O 
O 
O   $ 
 
 
 
. + + +
 + + + + " " " ' ' '  D D D DD    * . . .b ? ? ?, + + + +2   85: 5: 5: 5: 5: 5: 5: 5:p       F  
+	'8 '8 '8 '8T O O O O #$!QRSS ( ( (V 6&.  K00{##772{+C+C  GGIIk 66   	#**,,--4H4O4O4Q4Q0R0RR     r   