a
    ߙfbhK                     @   s|  d dl Z d dlZd dlmZmZ d dlmZ d dl	m
Z
 d dlmZmZmZ d dlmZ d dlmZ d dlmZ d	d
 Ze jddd Ze jddd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Z dd Z!d d! Z"d"d# Z#d$d% Z$d&d' Z%d(d) Z&d*d+ Z'd,d- Z(d.d/ Z)e jdd0d1 Z*e j+d2g d3d4d5 Z,e j+d6g d7d8d9 Z-d:d; Z.d<d= Z/dS )>    N)assert_equalassert_allclose)unitsmad_std)
sigma_clip	SigmaClipsigma_clipped_stats)AstropyUserWarning)NumpyRNGContext)	HAS_SCIPYc                  C   s  t d tjd} t| ddd}t|jdks8J t|j | jk sNJ t| ddtjd}t	|j|jkrvJ t| ddtj
d}t	|j|jkrJ t| d	d d}|jd | d ksJ |jd  d
7  < |jd | d ksJ t| d	d dd}|jd | d ksJ |jd  d
7  < |jd | d ks<J tdtjddd ttd }t|ddd}| dksJ t|ddd}| dksJ W d    n1 s0    Y  d S )N90  '        sigmamaxitersr   )r   r   stdfuncr   r   cenfunc         ?F)r   r   copy           皙?r   r   gffffff@axisr         )r   nprandomrandnr   summasksizevarallmeandataarangenormalZdiagonescount)randvarfiltered_dataZfiltered_data2Zfiltered_data3r+    r2   Flib/python3.9/site-packages/astropy/stats/tests/test_sigma_clipping.pytest_sigma_clip   s<    r4   znot HAS_SCIPYc                  C   s6   t d} d| d< t| ddd}t|| dd  dS )z`
    For masked=False and axis=None, masked elements should be removed
    from the result.
    g      $@d   r   FN)maskedr   r   )r"   r,   r   r   r+   resultr2   r2   r3   test_axis_none>   s    
r9   c                  C   s   ddl m}  tdh tjd}t|dd tjd}| |ddd }|	 t
|ksZJ t||j  j| W d    n1 s0    Y  d S )Nr   )statsr   r   r   r   )Zscipyr:   r   r"   r#   r$   r   r*   Z	sigmaclipr/   lenr   r&   r+   )r:   r0   Z
astropyresZscipyresr2   r2   r3   test_compare_to_scipy_sigmaclipJ   s    
r<   c                  C   s,   t d} t| ddd}|jjdks(J dS )z,Test that the returned mask is not a scalar.r         Y@r   r   r2   N)r"   r,   r   r&   shaper7   r2   r2   r3   test_sigma_clip_scalar_mask\   s    
r?   c                  C   sh   t dL tjd} d| d< tddd}t| ddd}t|| | W d    n1 sZ0    Y  d S )Nr   r5        j@
   r   r   r   )r   r"   r#   r$   r   r   r   )r+   ZsobjZsfuncr2   r2   r3   test_sigma_clip_classc   s    
rB   c                  C   s   t dr tjddd} d| d< tddd	d
}tddtjd
}t|| ||  t|| dd|| dd W d    n1 s0    Y  d S )Nr   r   r   )rA   rA   r@   r   r   r   r   r*   r   r   r   )r   r"   r#   r-   r   Znanmeanr   )r+   Zsobj1Zsobj2r2   r2   r3   test_sigma_clip_meanl   s    
rE   c                   C   sl   t t tdd W d    n1 s*0    Y  t t tdd W d    n1 s^0    Y  d S )NZinvalid)r   )r   )pytestZraises
ValueErrorr   r2   r2   r2   r3   'test_sigma_clip_invalid_cenfunc_stdfuncv   s    (rH   c                  C   s,  ddg} t ddg}t| |d}t|d ts4J |dks@J t| |dd}t|| t| dd	}t|d tsvJ |dksJ dd
g} t| }t|d tsJ |dksJ t d}t j||d| g} t	| dddj
dd}t|| t| ddd\}}}t|| t|| t|t | dS )z5Test list data with input mask or mask_value (#3268).r   r   TFr&   )r   r   r   )r&   r   r   Z
mask_valuer   )r   r   r   rA   r   rD   N)r"   arrayr	   
isinstancefloatr   r,   maMaskedArrayr   r*   
zeros_like)r+   r&   r8   result2_datar*   medianZstddevr2   r2   r3   test_sigma_clipped_stats~   s,    




rT   c                  C   s   t dp tjd} d| d< t| \}}}t| dd\}}}||ksJJ ||ksVJ t|d t|d W d    n1 s~0    Y  d S )	Nr   r   r@   rA   r   )Zstd_ddofgji?gZhi?)r   r"   r#   r$   r	   r   )r+   Zmean1Zmedian1Zstddev1Zmean2Zmedian2Zstddev2r2   r2   r3   test_sigma_clipped_stats_ddof   s    

rU   c            	      C   s"  t d} d| d< t j| d< t j| d< t j| }tjtdd t	| }W d   n1 s^0    Y  tjtdd t	|}W d   n1 s0    Y  t
|j|j t
|j|j |jd sJ |jd sJ |jd sJ tjtdd t	| d	d
}W d   n1 s0    Y  |jd s0J |jd s@J tjtdd t	| d	dd}W d   n1 st0    Y  |jd sJ |jd sJ t j| d	ddf< tjtdd& t	| dddd\}}}W d   n1 s0    Y  t |d	 s
J t |d	 sJ dS )z2Test sigma_clip of data containing invalid values.r     rC   r      )r   r   z"Input data contains invalid values)matchNr   rD   F)r   r   r   T)r   r6   return_bounds)r"   r.   naninfrN   rO   rF   Zwarnsr
   r   r   r+   r&   isnan)	r+   Zdata_mar8   Z	result_marQ   Zresult3_ZminarrZmaxarrr2   r2   r3   test_invalid_sigma_clip   sN    


&&,.,r_   c                  C   s   t d} t| dd dS )zETest that dimensions are expanded correctly even if axis is negative.rW   rD   N)r"   r.   r   )r+   r2   r2   r3   test_sigmaclip_negative_axis   s    
ra   c                  C   s   t jjddgddggddgddggd} t| }t j| |sBJ t| dd}t|t jjr`J t t |stJ t| dd\}}}t j| |sJ t |sJ t |sJ dS )	zb
    Make sure a fully masked array is returned when sigma clipping a
    fully masked array.
    r   r   Tr+   r&   F)r6   rZ   N)r"   rN   rO   r   allequalrL   r)   r]   r+   Zclipped_dataZlowZhighr2   r2   r3   test_sigmaclip_fully_masked   s    rf   c                  C   sn   t jjg g d} t| }t j| |s*J t| dd\}}}t j| |sNJ t |s\J t |sjJ dS )zd
    Make sure an empty masked array is returned when sigma clipping an
    empty masked array.
    rb   Trc   N)r"   rN   rO   r   rd   r]   re   r2   r2   r3   test_sigmaclip_empty_masked   s    rg   c                  C   sl   t g } t| }t|t jjs$J t| |j t| dd\}}}t| | t |sZJ t |shJ dS )zV
    Make sure an empty array is returned when sigma clipping an empty
    array.
    Trc   N)	r"   rK   r   rL   rN   rO   r   r+   r]   re   r2   r2   r3   test_sigmaclip_empty  s    

rh   c            	      C   s   t dt d ddd} t j| t jd}t | dd}t |dd}t||D ]@\}}| }d|	  }t 
||| k ||| k|dd< qTt| dt jdd	d
}t|j| dS )z=Test sigma clipping over a subset of axes (issue #7227).
    g(\?   r   )dtyper   r         ?N)r   r`   )r   r   r   r   )r"   Zsinr,   reshaperP   Zbool_Zrollaxiszipr*   stdZ
logical_orr   r   r&   )	r+   r&   Zdata_tZmask_tZ
data_planeZ
mask_planer*   Zmaxdevr8   r2   r2   r3   test_sigma_clip_axis_tuple_3D  s    
ro   c                  C   s2   t  } d}d}t| |ksJ t| |ks.J d S )NzoSigmaClip(sigma=3.0, sigma_lower=3.0, sigma_upper=3.0, maxiters=5, cenfunc='median', stdfunc='std', grow=False)z<SigmaClip>
    sigma: 3.0
    sigma_lower: 3.0
    sigma_upper: 3.0
    maxiters: 5
    cenfunc: 'median'
    stdfunc: 'std'
    grow: False)r   reprstr)ZsigclipZsigclip_reprZsigclip_strr2   r2   r3   test_sigmaclip_repr/  s
    rr   c                  C   sD   t ddgtj } t| }|dtj dtj dtj fks@J d S )Nr   r   r   )r"   rK   uZkpcr	   r7   r2   r2   r3   test_sigma_clippped_stats_unit?  s    rt   c                  C   s   t jjt ddd} t| }|t jjt jjt jjfks<J t jjt ddd} t| dd}|t jjt jjt jjfks|J t jjt ddd} | dk }t| |d}|t jjt jjt jjfksJ dS )	zM
    Test sigma_clipped_stats when the input array is completely masked.
    rA   TrI   Fr   rJ   r    N)r"   rN   rO   r,   r	   r6   Zzeros)Zarrr8   r&   r2   r2   r3   $test_sigma_clippped_stats_all_maskedE  s    ru   c                  C   s  t g d} t| dddddd}|j| jks2J t|j|  t |j| rPJ t| dddddd}|j| jkstJ t|j|  t |j| sJ t| dddddd}|j| jksJ t|j|  t |j| rJ t| dddddd}|j| jksJ t|j|  t |j| sJ dS )	a  
    Test that the data values & type returned by sigma_clip are the same as
    its input when using masked=True (rather than being upcast to float64 &
    containing NaNs as in issue #10605) and also that the input data get
    copied or referenced as appropriate.
    )r   ir       r   rk   r   NT)r   r   r   r6   r   Fr   )r"   rK   r   rj   r   r+   Zshares_memoryr7   r2   r2   r3   "test_sigma_clip_masked_data_valuesX  s2    ry   c                  C   s   t g d} t| dddd}t g d}t t |jd |sHJ | dd	d	} t| d
dddd}t g dg dg dg}t t |j|sJ d| d< t| dddd}t g dg dg dg}t t |j|sJ dS )z{
    Test sigma_clip with growth of masking to include the neighbours within a
    specified radius of deviant values.
    )d皙ɿQ?gp=
ףgQgQ?g=
ףp=?g
ףp=
?gQ?gp=
ף?g      ?)\(?ggHzG?gq=
ףp?皙?g{Gz?g       gGz׿gQ?g)\(ܿgHzGr{   g      
@gRQg(\Q?g333333?gp=
ף?r   gq=
ףp?gQg(\g(\g(\gQgQ?gRQr~   g(\Q?gzGrz   gp=
ףg
ףp=
g(\g(\?gRQ?      r   r}   gQ?g      ?{Gzr   gHzG?q=
ףpgg{Gz?gRQ?gQgQ?r   r   gq=
ףp?333333?gQg{GzgffffffggQgHzGgQ?g
ףp=
?gGz?r   g      gףp=
r   g\(\g)\(?r   g(\g=
ףp=?gQ?r|   gQ?g      r   gp=
ףgQ?gRQ?g\(\@g)\(       @gQ?g?r~   r   g(\?g333333?r   r   r   )r   r   grow)r   rX   r                            !   '   (   )   B   C   D   T   U   V   Z   [   \   ]   ^   r   rX   r   g @rk   )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   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )&r   r   r   rX   rX   rX   r   r   r   r   r   r   r   r   r   r   r   r   rX   rX   r   r   r   r   r   r   rX   rX   rX   r   r   r   r   r   r   rX   rX   rX   )&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   r   r   r   r   r   r   r   r   r   r=   )r   r   r   g      @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   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   rX   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   rX   r   r   r   r   r   r   r   r   r   r   r   r   r   r   N)r"   rK   r   Zarray_equalwherer&   rl   )r+   r1   Zexpectedr2   r2   r3   test_sigma_clip_grow  s4    	
		r   )r   bounds_shape))r   )rX   r         )r   )r   r   r   r   )r`   )r   rX   r   r   ))r   r   r   r   r   ))r   r   r   ))r   r   rX   )r   r   c                 C   s   t d tjd}W d    n1 s*0    Y  t|| d}|j|jksPJ t|| dd\}}}|j|jkstJ |j|ksJ |j|ksJ d S )Nr   )r   rX   r   r   r   rD   T)r   rZ   )r   r"   r#   r   r>   )r   r   rK   result1rQ   Zbound1Zbound2r2   r2   r3   test_sigma_clip_axis_shapes  s    

*r   rj   )z>f2z<f2z>f4z<f4z>f8z<f8z<i4z>i8c                 C   sv   t d& tjdddt}W d    n1 s40    Y  d|d< t|ddd	}t|| ddd	}t|| d S )
Nr   rw   r   rV   r5      TF)r   r6   )r   r"   r#   ZrandintZastyperM   r   r   )rj   rK   Z	referenceZactualr2   r2   r3   test_sigma_clip_dtypes  s    
4r   c               	   C   s   t g d} t| dddddd}t||  t| dddddd}t|g d	 t| dddddd
d}t||  t| dddddd
d}t|dt jddt jg d S )N)r   r   rX   r   r   rS   rn   r   r   F)r   r   r   r   r6   r   )r   rX   r   r   )r   r   r   r   r6   r   rX   r   )r"   rK   r   r   r[   )rK   Z
result_stdZresult_mad_stdr2   r2   r3   test_mad_std  s"    

r   c                  C   sx   t d  tjddd} W d    n1 s.0    Y  ddd}t| dd |ddd	}t| dd d
ddd	}t|| d S )Nr   r`   r   )r   r   c                 S   s   t | |ddS )NT)r   Z
ignore_nanr   )r+   r   r2   r2   r3   nan_mad_std  s    z'test_mad_std_large.<locals>.nan_mad_stdr   F)r   r   r   r   r6   r   )N)r   r"   r#   Zuniformr   r   )rK   r   r   rQ   r2   r2   r3   test_mad_std_large  s    
.
r   )0rF   Znumpyr"   Znumpy.testingr   r   Zastropyr   rs   Zastropy.statsr   Zastropy.stats.sigma_clippingr   r   r	   Zastropy.utils.exceptionsr
   Zastropy.utils.miscr   Z"astropy.utils.compat.optional_depsr   r4   ZmarkZskipifr9   r<   r?   rB   rE   rH   rT   rU   r_   ra   rf   rg   rh   ro   rr   rt   ru   ry   r   Zparametrizer   r   r   r   r2   r2   r2   r3   <module>   sJ   /



	
"1)

=

