B
    }]                 @   sv   d Z ddlmZmZmZ ddlZddlmZm	Z	m
Z
mZ ddlmZ ddd	d
gZG dd de	ZdejdfddZdS )zD
Convenience interface to N-D interpolation

.. versionadded:: 0.9

    )divisionprint_functionabsolute_importN   )LinearNDInterpolatorNDInterpolatorBaseCloughTocher2DInterpolator_ndim_coords_from_arrays)cKDTreegriddataNearestNDInterpolatorr   r   c               @   s"   e Zd ZdZdddZdd ZdS )	r   a  
    NearestNDInterpolator(x, y)

    Nearest-neighbour interpolation in N dimensions.

    .. versionadded:: 0.9

    Methods
    -------
    __call__

    Parameters
    ----------
    x : (Npoints, Ndims) ndarray of floats
        Data point coordinates.
    y : (Npoints,) ndarray of float or complex
        Data values.
    rescale : boolean, optional
        Rescale points to unit cube before performing interpolation.
        This is useful if some of the input dimensions have
        incommensurable units and differ by many orders of magnitude.

        .. versionadded:: 0.14.0
    tree_options : dict, optional
        Options passed to the underlying ``cKDTree``.

        .. versionadded:: 0.17.0


    Notes
    -----
    Uses ``scipy.spatial.cKDTree``

    FNc             C   sD   t j| |||ddd |d kr$t }t| jf|| _t|| _d S )NF)rescaleZneed_contiguousZneed_values)	r   __init__dictr
   pointstreenpasarrayvalues)selfxyr   Ztree_options r   h/home/fristb/BIRCH/lib-linux-x86_64/python/lib64/python3.7/site-packages/scipy/interpolate/ndgriddata.pyr   :   s    zNearestNDInterpolator.__init__c             G   sB   t || jjd d}| |}| |}| j|\}}| j| S )z
        Evaluate interpolator at given points.

        Parameters
        ----------
        xi : ndarray of float, shape (..., ndim)
            Points where to interpolate data at.

        r   )ndim)r	   r   shapeZ_check_call_shapeZ_scale_xr   queryr   )r   argsxidistir   r   r   __call__C   s
    


zNearestNDInterpolator.__call__)FN)__name__
__module____qualname____doc__r   r!   r   r   r   r   r      s   "
	linearFc       
      C   s,  t | } | jdk r| j}n
| jd }|dkr|dkrddlm} |  } t|trlt|dkrft	d|\}t
| }| | } || }|dkrd}|| ||d	d
|d}	|	|S |dkrt| ||d}	|	|S |dkrt| |||d}	|	|S |dkr|dkrt| |||d}	|	|S t	d||f dS )a  
    Interpolate unstructured D-dimensional data.

    Parameters
    ----------
    points : 2-D ndarray of floats with shape (n, D), or length D tuple of 1-D ndarrays with shape (n,).
        Data point coordinates. 
    values : ndarray of float or complex, shape (n,)
        Data values.
    xi : 2-D ndarray of floats with shape (m, D), or length D tuple of ndarrays broadcastable to the same shape.
        Points at which to interpolate data.
    method : {'linear', 'nearest', 'cubic'}, optional
        Method of interpolation. One of

        ``nearest``
          return the value at the data point closest to
          the point of interpolation.  See `NearestNDInterpolator` for
          more details.

        ``linear``
          tessellate the input point set to n-dimensional
          simplices, and interpolate linearly on each simplex.  See
          `LinearNDInterpolator` for more details.

        ``cubic`` (1-D)
          return the value determined from a cubic
          spline.

        ``cubic`` (2-D)
          return the value determined from a
          piecewise cubic, continuously differentiable (C1), and
          approximately curvature-minimizing polynomial surface. See
          `CloughTocher2DInterpolator` for more details.
    fill_value : float, optional
        Value used to fill in for requested points outside of the
        convex hull of the input points.  If not provided, then the
        default is ``nan``. This option has no effect for the
        'nearest' method.
    rescale : bool, optional
        Rescale points to unit cube before performing interpolation.
        This is useful if some of the input dimensions have
        incommensurable units and differ by many orders of magnitude.

        .. versionadded:: 0.14.0
        
    Returns
    -------
    ndarray
        Array of interpolated values.

    Notes
    -----

    .. versionadded:: 0.9

    Examples
    --------

    Suppose we want to interpolate the 2-D function

    >>> def func(x, y):
    ...     return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2

    on a grid in [0, 1]x[0, 1]

    >>> grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j]

    but we only know its values at 1000 data points:

    >>> points = np.random.rand(1000, 2)
    >>> values = func(points[:,0], points[:,1])

    This can be done with `griddata` -- below we try out all of the
    interpolation methods:

    >>> from scipy.interpolate import griddata
    >>> grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest')
    >>> grid_z1 = griddata(points, values, (grid_x, grid_y), method='linear')
    >>> grid_z2 = griddata(points, values, (grid_x, grid_y), method='cubic')

    One can see that the exact result is reproduced by all of the
    methods to some degree, but for this smooth function the piecewise
    cubic interpolant gives the best results:

    >>> import matplotlib.pyplot as plt
    >>> plt.subplot(221)
    >>> plt.imshow(func(grid_x, grid_y).T, extent=(0,1,0,1), origin='lower')
    >>> plt.plot(points[:,0], points[:,1], 'k.', ms=1)
    >>> plt.title('Original')
    >>> plt.subplot(222)
    >>> plt.imshow(grid_z0.T, extent=(0,1,0,1), origin='lower')
    >>> plt.title('Nearest')
    >>> plt.subplot(223)
    >>> plt.imshow(grid_z1.T, extent=(0,1,0,1), origin='lower')
    >>> plt.title('Linear')
    >>> plt.subplot(224)
    >>> plt.imshow(grid_z2.T, extent=(0,1,0,1), origin='lower')
    >>> plt.title('Cubic')
    >>> plt.gcf().set_size_inches(6, 6)
    >>> plt.show()

       r   )nearestr&   cubic)interp1dz"invalid number of dimensions in xir)   Zextrapolater   F)kindaxisZbounds_error
fill_value)r   r&   )r.   r   r*   z7Unknown interpolation method %r for %d dimensional dataN)r	   r   r   interpolater+   ravel
isinstancetuplelen
ValueErrorr   argsortr   r   r   )
r   r   r   methodr.   r   r   r+   idxipr   r   r   r   X   s@    i



)r%   
__future__r   r   r   numpyr   interpndr   r   r   r	   Zscipy.spatialr
   __all__r   nanr   r   r   r   r   <module>   s   B