ó
Ê½÷Xc           @` s¸   d  d l  m Z m Z m Z d  d l Z d d l m Z d d l m Z d d d d	 g Z d
 „  Z	 d „  Z
 d d d d „ Z d d d d „ Z d d d d „ Z d d d d „ Z d S(   i    (   t   divisiont   print_functiont   absolute_importNi   (   t   _ni_support(   t	   _nd_imaget   fourier_gaussiant   fourier_uniformt   fourier_ellipsoidt   fourier_shiftc         C` s	  |  d  k rr | j j t j t j t j g k rN t j | j d | j ƒ}  n t j | j d t j	 ƒ}  |  } n t |  ƒ t k rØ |  t j t j t j t j	 g k r· t
 d ƒ ‚ n  t j | j d |  ƒ}  |  } n' |  j | j k rù t
 d ƒ ‚ n  d  } |  | f S(   Nt   dtypes   output type not supporteds   output shape not correct(   t   NoneR	   t   typet   numpyt	   complex64t
   complex128t   float32t   zerost   shapet   float64t   RuntimeError(   t   outputt   inputt   return_value(    (    s4   /tmp/pip-build-7oUkmx/scipy/scipy/ndimage/fourier.pyt   _get_output_fourier)   s     		c         C` s÷   |  d  k rl | j j t j t j g k rH t j | j d | j ƒ}  n t j | j d t j ƒ}  |  } n t |  ƒ t k rÆ |  t j t j g k r¥ t d ƒ ‚ n  t j | j d |  ƒ}  |  } n' |  j | j k rç t d ƒ ‚ n  d  } |  | f S(   NR	   s   output type not supporteds   output shape not correct(	   R
   R	   R   R   R   R   R   R   R   (   R   R   R   (    (    s4   /tmp/pip-build-7oUkmx/scipy/scipy/ndimage/fourier.pyt   _get_output_fourier_complex>   s    		iÿÿÿÿc         C` s¡   t  j |  ƒ }  t | |  ƒ \ } } t j | |  j ƒ } t j | |  j ƒ } t  j | d t  j ƒ} | j j	 s | j
 ƒ  } n  t j |  | | | | d ƒ | S(   sj  
    Multi-dimensional Gaussian fourier filter.

    The array is multiplied with the fourier transform of a Gaussian
    kernel.

    Parameters
    ----------
    input : array_like
        The input array.
    sigma : float or sequence
        The sigma of the Gaussian kernel. If a float, `sigma` is the same for
        all axes. If a sequence, `sigma` has to contain one value for each
        axis.
    n : int, optional
        If `n` is negative (default), then the input is assumed to be the
        result of a complex fft.
        If `n` is larger than or equal to zero, the input is assumed to be the
        result of a real fft, and `n` gives the length of the array before
        transformation along the real transform direction.
    axis : int, optional
        The axis of the real transform.
    output : ndarray, optional
        If given, the result of filtering the input is placed in this array.
        None is returned in this case.

    Returns
    -------
    fourier_gaussian : ndarray or None
        The filtered input. If `output` is given as a parameter, None is
        returned.

    Examples
    --------
    >>> from scipy import ndimage, misc
    >>> import numpy.fft
    >>> import matplotlib.pyplot as plt
    >>> fig, (ax1, ax2) = plt.subplots(1, 2)
    >>> plt.gray()  # show the filtered result in grayscale
    >>> ascent = misc.ascent()
    >>> input_ = numpy.fft.fft2(ascent)
    >>> result = ndimage.fourier_gaussian(input_, sigma=4)
    >>> result = numpy.fft.ifft2(result)
    >>> ax1.imshow(ascent)
    >>> ax2.imshow(result.real)  # the imaginary part is an artifact
    >>> plt.show()
    R	   i    (   R   t   asarrayR   R   t   _check_axist   ndimt   _normalize_sequenceR   t   flagst
   contiguoust   copyR   t   fourier_filter(   R   t   sigmat   nt   axisR   R   t   sigmas(    (    s4   /tmp/pip-build-7oUkmx/scipy/scipy/ndimage/fourier.pyR   Q   s    0c         C` s¡   t  j |  ƒ }  t | |  ƒ \ } } t j | |  j ƒ } t j | |  j ƒ } t  j | d t  j ƒ} | j j	 s | j
 ƒ  } n  t j |  | | | | d ƒ | S(   sl  
    Multi-dimensional uniform fourier filter.

    The array is multiplied with the fourier transform of a box of given
    size.

    Parameters
    ----------
    input : array_like
        The input array.
    size : float or sequence
        The size of the box used for filtering.
        If a float, `size` is the same for all axes. If a sequence, `size` has
        to contain one value for each axis.
    n : int, optional
        If `n` is negative (default), then the input is assumed to be the
        result of a complex fft.
        If `n` is larger than or equal to zero, the input is assumed to be the
        result of a real fft, and `n` gives the length of the array before
        transformation along the real transform direction.
    axis : int, optional
        The axis of the real transform.
    output : ndarray, optional
        If given, the result of filtering the input is placed in this array.
        None is returned in this case.

    Returns
    -------
    fourier_uniform : ndarray or None
        The filtered input. If `output` is given as a parameter, None is
        returned.

    Examples
    --------
    >>> from scipy import ndimage, misc
    >>> import numpy.fft
    >>> import matplotlib.pyplot as plt
    >>> fig, (ax1, ax2) = plt.subplots(1, 2)
    >>> plt.gray()  # show the filtered result in grayscale
    >>> ascent = misc.ascent()
    >>> input_ = numpy.fft.fft2(ascent)
    >>> result = ndimage.fourier_uniform(input_, size=20)
    >>> result = numpy.fft.ifft2(result)
    >>> ax1.imshow(ascent)
    >>> ax2.imshow(result.real)  # the imaginary part is an artifact
    >>> plt.show()
    R	   i   (   R   R   R   R   R   R   R   R   R   R   R   R   R    (   R   t   sizeR"   R#   R   R   t   sizes(    (    s4   /tmp/pip-build-7oUkmx/scipy/scipy/ndimage/fourier.pyR      s    0c         C` s¡   t  j |  ƒ }  t | |  ƒ \ } } t j | |  j ƒ } t j | |  j ƒ } t  j | d t  j ƒ} | j j	 s | j
 ƒ  } n  t j |  | | | | d ƒ | S(   sÎ  
    Multi-dimensional ellipsoid fourier filter.

    The array is multiplied with the fourier transform of a ellipsoid of
    given sizes.

    Parameters
    ----------
    input : array_like
        The input array.
    size : float or sequence
        The size of the box used for filtering.
        If a float, `size` is the same for all axes. If a sequence, `size` has
        to contain one value for each axis.
    n : int, optional
        If `n` is negative (default), then the input is assumed to be the
        result of a complex fft.
        If `n` is larger than or equal to zero, the input is assumed to be the
        result of a real fft, and `n` gives the length of the array before
        transformation along the real transform direction.
    axis : int, optional
        The axis of the real transform.
    output : ndarray, optional
        If given, the result of filtering the input is placed in this array.
        None is returned in this case.

    Returns
    -------
    fourier_ellipsoid : ndarray or None
        The filtered input. If `output` is given as a parameter, None is
        returned.

    Notes
    -----
    This function is implemented for arrays of rank 1, 2, or 3.

    Examples
    --------
    >>> from scipy import ndimage, misc
    >>> import numpy.fft
    >>> import matplotlib.pyplot as plt
    >>> fig, (ax1, ax2) = plt.subplots(1, 2)
    >>> plt.gray()  # show the filtered result in grayscale
    >>> ascent = misc.ascent()
    >>> input_ = numpy.fft.fft2(ascent)
    >>> result = ndimage.fourier_ellipsoid(input_, size=20)
    >>> result = numpy.fft.ifft2(result)
    >>> ax1.imshow(ascent)
    >>> ax2.imshow(result.real)  # the imaginary part is an artifact
    >>> plt.show()
    R	   i   (   R   R   R   R   R   R   R   R   R   R   R   R   R    (   R   R%   R"   R#   R   R   R&   (    (    s4   /tmp/pip-build-7oUkmx/scipy/scipy/ndimage/fourier.pyR   È   s    4c         C` sž   t  j |  ƒ }  t | |  ƒ \ } } t j | |  j ƒ } t j | |  j ƒ } t  j | d t  j ƒ} | j j	 s | j
 ƒ  } n  t j |  | | | | ƒ | S(   sc  
    Multi-dimensional fourier shift filter.

    The array is multiplied with the fourier transform of a shift operation.

    Parameters
    ----------
    input : array_like
        The input array.
    shift : float or sequence
        The size of the box used for filtering.
        If a float, `shift` is the same for all axes. If a sequence, `shift`
        has to contain one value for each axis.
    n : int, optional
        If `n` is negative (default), then the input is assumed to be the
        result of a complex fft.
        If `n` is larger than or equal to zero, the input is assumed to be the
        result of a real fft, and `n` gives the length of the array before
        transformation along the real transform direction.
    axis : int, optional
        The axis of the real transform.
    output : ndarray, optional
        If given, the result of shifting the input is placed in this array.
        None is returned in this case.

    Returns
    -------
    fourier_shift : ndarray or None
        The shifted input. If `output` is given as a parameter, None is
        returned.

    Examples
    --------
    >>> from scipy import ndimage, misc
    >>> import matplotlib.pyplot as plt
    >>> import numpy.fft
    >>> fig, (ax1, ax2) = plt.subplots(1, 2)
    >>> plt.gray()  # show the filtered result in grayscale
    >>> ascent = misc.ascent()
    >>> input_ = numpy.fft.fft2(ascent)
    >>> result = ndimage.fourier_shift(input_, shift=200)
    >>> result = numpy.fft.ifft2(result)
    >>> ax1.imshow(ascent)
    >>> ax2.imshow(result.real)  # the imaginary part is an artifact
    >>> plt.show()
    R	   (   R   R   R   R   R   R   R   R   R   R   R   R   R   (   R   t   shiftR"   R#   R   R   t   shifts(    (    s4   /tmp/pip-build-7oUkmx/scipy/scipy/ndimage/fourier.pyR     s    /(   t
   __future__R    R   R   R   t    R   R   t   __all__R   R   R
   R   R   R   R   (    (    (    s4   /tmp/pip-build-7oUkmx/scipy/scipy/ndimage/fourier.pyt   <module>   s   				<;?