3
K้d?2  ใ               @   sิ   d Z ddlZddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZ dd ZG dd	 d	ejZeZG d
d deZG dd deeZeZG dd dZG dd deZG dd dZdS )zฝTests suite for MaskedArray & subclassing.

:author: Pierre Gerard-Marchant
:contact: pierregm_at_uga_dot_edu
:version: $Id: test_subclassing.py 3473 2007-10-29 15:18:13Z jarrod.millman $

้    N)ฺassert_ฺassert_raises)ฺassert_equal)ฺarrayฺarangeฺmaskedฺMaskedArrayฺmasked_arrayฺlogฺaddฺhypotฺdivideฺasarrayฺ
asanyarrayฺnomaskc             C   s   t | d t| | d S )N)r   ฺlen)ฺaฺbฉ r   ๚S/var/www/html/virt/lib64/python3.6/site-packages/numpy/ma/tests/test_subclassing.pyฺassert_startswith   s    r   c                   s@   e Zd Zi fddZ fddZ fddZ fddZ  ZS )	ฺSubArrayc             C   s   t j|j| }|j |_|S )N)ฺnpr   ฺviewฺcopyฺinfo)ฺclsZarrr   ฺxr   r   r   ฺ__new__   s    
zSubArray.__new__c                s<   t ttt| dd r&tt| j| t|di j | _d S )Nฺ__array_finalize__r   )ฺcallableฺgetattrฺsuperr   r   r   r   )ฺselfฺobj)ฺ	__class__r   r   r      s
    
zSubArray.__array_finalize__c                s,   t t| j|}|jjddd |jd< |S )Nฺaddedr   ้   )r"   r   ฺ__add__r   ฺget)r#   ฺotherฺresult)r%   r   r   r(   %   s    zSubArray.__add__c                s,   t t| j|}|jjddd |jd< |S )Nฺiaddedr   r'   )r"   r   ฺ__iadd__r   r)   )r#   r*   r+   )r%   r   r   r-   *   s    zSubArray.__iadd__)ฺ__name__ฺ
__module__ฺ__qualname__r   r   r(   r-   ฺ__classcell__r   r   )r%   r   r      s   r   c                   s"   e Zd ZdZd fdd	Z  ZS )ฺSubMaskedArrayz<Pure subclass of MaskedArray, keeping some info on subclass.Nc                s"   t t| j| f|}||jd< |S )Nr   )r"   r2   r   ฺ_optinfo)r   r   ฺkwargsr$   )r%   r   r   r   5   s    
zSubMaskedArray.__new__)N)r.   r/   r0   ฺ__doc__r   r1   r   r   )r%   r   r2   3   s   r2   c               @   s&   e Zd Zi efddZedd ZdS )ฺ	MSubArrayc             C   s&   t ||}tj| ||d}|j|_|S )N)ฺdataฺmask)r   r   r   r   )r   r7   r   r8   Zsubarrฺ_datar   r   r   r   =   s    
zMSubArray.__new__c             C   s   | j t}d|_|S )NF)r   r   Z_sharedmask)r#   Z_viewr   r   r   ฺ_seriesC   s    
zMSubArray._seriesN)r.   r/   r0   r   r   ฺpropertyr:   r   r   r   r   r6   ;   s   r6   c               @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )ฺCSAIteratorz฿
    Flat iterator object that uses its own setter/getter
    (works around ndarray.flat not propagating subclass setters/getters
    see https://github.com/numpy/numpy/issues/4564)
    roughly following MaskedIterator
    c             C   s   || _ |jtjj| _d S )N)ฺ	_originalr   r   ฺndarrayฺflatฺ	_dataiter)r#   r   r   r   r   ฺ__init__X   s    zCSAIterator.__init__c             C   s   | S )Nr   )r#   r   r   r   ฺ__iter__\   s    zCSAIterator.__iter__c             C   s4   | j j|}t|tjs |j }|jt| j}|S )N)	r@   ฺ__getitem__ฺ
isinstancer   r>   ฺ	__array__r   ฺtyper=   )r#   Zindxฺoutr   r   r   rC   _   s
    zCSAIterator.__getitem__c             C   s   | j j|| j|< d S )N)r=   ฺ_validate_inputr@   )r#   ฺindexฺvaluer   r   r   ฺ__setitem__f   s    zCSAIterator.__setitem__c             C   s   t | jj jt| jS )N)ฺnextr@   rE   r   rF   r=   )r#   r   r   r   ฺ__next__i   s    zCSAIterator.__next__N)	r.   r/   r0   r5   rA   rB   rC   rK   rM   r   r   r   r   r<   Q   s   r<   c                   sh   e Zd Zdd Zdd Zdd Z fddZ fd	d
Zedd Z	e	j
dd Z	d fdd	Z  ZS )ฺComplicatedSubArrayc             C   s   dj | jtS )Nzmyprefix {0} mypostfix)ฺformatr   r   )r#   r   r   r   ฺ__str__o   s    zComplicatedSubArray.__str__c             C   s   dj | jj| S )Nz	<{0} {1}>)rO   r%   r.   )r#   r   r   r   ฺ__repr__r   s    zComplicatedSubArray.__repr__c             C   s   t |tstd|S )Nz!Can only set to MySubArray values)rD   rN   ฺ
ValueError)r#   rJ   r   r   r   rH   v   s    
z#ComplicatedSubArray._validate_inputc                s   t t| j|| j| d S )N)r"   rN   rK   rH   )r#   ฺitemrJ   )r%   r   r   rK   {   s    
zComplicatedSubArray.__setitem__c                s.   t t| j|}t|tjs*|j jt}|S )N)r"   rN   rC   rD   r   r>   rE   r   )r#   rS   rJ   )r%   r   r   rC      s    zComplicatedSubArray.__getitem__c             C   s   t | S )N)r<   )r#   r   r   r   r?      s    zComplicatedSubArray.flatc             C   s   | j  }||d d < d S )N)Zravel)r#   rJ   ฺyr   r   r   r?      s    Nc                sD   t t| j||}|d k	r@|d tjkr@|jjddd |jd< |S )Nr   Z
multipliedr'   )r"   rN   ฺ__array_wrap__r   ฺmultiplyr   r)   )r#   r$   ฺcontext)r%   r   r   rU      s    z"ComplicatedSubArray.__array_wrap__)N)r.   r/   r0   rP   rQ   rH   rK   rC   r;   r?   ฺsetterrU   r1   r   r   )r%   r   rN   m   s   rN   c               @   st   e Z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S )ฺTestSubclassingc             C   s2   t jddd}t|dddddgd}||f| _d S )N้   ฺfloat)Zdtyper   r'   )r8   )r   r   ฺ	msubarrayr7   )r#   r   ฺmxr   r   r   ฺsetup   s    zTestSubclassing.setupc             C   sZ   t jd}dddddg}t|}t||d}tt|t t|j| tt|jt d S )NrZ   r   r'   )r8   )	r   r   r   r	   r   rD   r   r   r9   )r#   r   ฺmฺxsubZxmsubr   r   r   ฺtest_data_subclassingก   s    
z%TestSubclassing.test_data_subclassingc             C   s   | j \}}tt|jt d S )N)r7   r   rD   r9   ฺsubarray)r#   r   r]   r   r   r   ฺtest_maskedarray_subclassingซ   s    
z,TestSubclassing.test_maskedarray_subclassingc             C   sL   | j \}}tjdd, ttt|t tt|tj| W d Q R X d S )Nฺignore)r   )r7   r   Zerrstater   rD   r
   r\   r   )r#   r   r]   r   r   r   ฺtest_masked_unary_operationsฐ   s    
z,TestSubclassing.test_masked_unary_operationsc             C   s   | j \}}ttt||t ttt||t tt||||  ttt||jt tttj||t ttt	||t ttt	||t d S )N)
r7   r   rD   r   r\   r   r9   rb   ฺouterr   )r#   r   r]   r   r   r   ฺtest_masked_binary_operationsท   s    
z-TestSubclassing.test_masked_binary_operationsc             C   s`   | j \}}t|j j |jd}ttt||t ttt||t tt||t|| d S )N)r8   )	r7   r	   rE   r8   r   rD   r   r\   r   )r#   r   r]   Zxmxr   r   r   ฺtest_masked_binary_operations2ฤ   s
    
z.TestSubclassing.test_masked_binary_operations2c             C   s  t tddgdgd  d}tt|}t|}|d }tt|t tt|t  tt|j	t
 t|j	ji  |d }tt|t tt|t tt|j	t
 t|j	jd dk |d7 }tt|t tt|t tt|j	t
 t|j	jd dk |jdddddg t|jdddddg |jjdddddg t|jdddddg t|dd	id
}t|}tt|d t|j|j d S )NrZ   r   r'   ้   )r8   r&   r,   ฺnamer   )r   r   )r   r   r	   rb   r\   r   rD   r   r6   r9   r   r   r   Z	_set_maskฺ_maskr:   ฺhasattr)r#   r   ZmyZymฺzr`   ฺmxsubr   r   r   ฺtest_attributepropagationฬ   s4    z)TestSubclassing.test_attributepropagationc             C   s  t jd}dddddg}dd t||D }t||d|id}t|dd	}tt|t  tt|t t|j	| t
|}tt|t  tt|t t|j	| t|d
d	}tt|t t|j|j t|j	|j	 t|}tt|t t|j|j t|j	| d S )NrZ   r   r'   c             S   s   g | ]\}}||fqS r   r   )ฺ.0ฺiฺjr   r   r   ๚
<listcomp>๑   s    z=TestSubclassing.test_subclasspreservation.<locals>.<listcomp>r`   )r8   r   F)ZsubokT)r   r   ฺzipr6   r	   r   rD   r   r   rk   r   r   r   )r#   r   r_   Zxinfor`   rn   r   r   r   ฺtest_subclasspreservationํ   s(    
z)TestSubclassing.test_subclasspreservationc             C   sส  t jd}t|}t|dddddgd}tt|d t tt|d
 t tt|dd t tt|d t tt|d jt t|d tk tt|d jt tt|dd jt tt|jd jt t|jd tk tt|jdd j	t t
t|jd|d  t
t|jd|d  t
t|jtdd|dd  |d |d< |dd |dd< t
t|jjd|d  t
t|jjtdd|dd  |d |jd< |dd |jdd< d	S )z,test that getter and setter go via baseclassrZ   TF)r8   r'   .ri   r   N)r'   .)r'   .)r   .)r   r   rN   r	   r   rD   r7   r   r?   ฺbaser   rR   rK   ฺslice)r#   r   ฺxcsubฺmxcsubr   r   r   ฺtest_subclass_items  s.    
 z#TestSubclassing.test_subclass_itemsc             C   sj   t jd}t|}t|}tt|d jt tt|d jt tt|d t tt|d t d S )NrZ   r'   .r   )r'   .)r   .)r   r   rN   r	   r   rD   r7   )r#   r   rx   Zmxcsub_nomaskr   r   r   ฺtest_subclass_nomask_items-  s    
z*TestSubclassing.test_subclass_nomask_itemsc             C   sf   t jd}t|dddddgd}tt|d t|}t|dddddgd}tt|djtj dS )zOtest that repr uses the name of the subclass
        and 'array' for np.ndarrayrZ   TF)r8   r	   z!masked_{0}(data=[--, 1, --, 3, 4]N)r   r   r	   r   ฺreprr   rO   r.   )r#   r   r]   r`   rn   r   r   r   ฺtest_subclass_repr8  s    
z"TestSubclassing.test_subclass_reprc             C   s|   t jd}t|}t|dddddgd}tt|d t|}tt|j	dt j
jj t|dddddgd}tt|d dS )	z7test str with subclass that has overridden str, setitemrZ   TF)r8   z[-- 1 -- 3 4]r   z myprefix [-- 1 -- 3 4] mypostfixN)r   r   r   r	   r   ฺstrrN   r   rR   rK   ฺmaฺcoreZmasked_print_option)r#   r   r`   rn   rx   ry   r   r   r   ฺtest_subclass_strC  s    

z!TestSubclassing.test_subclass_strc             C   s   t dddddddgd}t d	dddddgd}tj||}td
|jk t|jd
 dk || }td
|jk t|jd
 dk d S )Nฺtestr'   ้   ้   ri   rZ   ้   )r7   r   r   )r2   r   ฺsubtractr   r3   )r#   Zarr1Zarr2Zdiff1Zdiff2r   r   r   ฺ$test_pure_subclass_info_preservationQ  s    z4TestSubclassing.test_pure_subclass_info_preservationN)r.   r/   r0   r^   ra   rc   re   rg   rh   ro   ru   rz   r{   r}   r   r   r   r   r   r   rY      s   
!%rY   )r5   Znumpyr   Znumpy.testingr   r   Znumpy.ma.testutilsr   Znumpy.ma.corer   r   r   r   r	   r
   r   r   r   r   r   r   r   r>   r   rb   r2   r6   r\   r<   rN   rY   r   r   r   r   ฺ<module>   s   8,