
    (ph=/                     v    S r SSKrSSKJrJrJrJr  SSKJ	r	  / SQr
 " S S\5      rS	\R                  S
4S jrg)zD
Convenience interface to N-D interpolation

.. versionadded:: 0.9

    N   )LinearNDInterpolatorNDInterpolatorBaseCloughTocher2DInterpolator_ndim_coords_from_arrays)cKDTree)griddataNearestNDInterpolatorr   r   c                   (    \ rS rSrSrSS jrS rSrg)r
      ah  NearestNDInterpolator(x, y).

Nearest-neighbor interpolator in N > 1 dimensions.

.. versionadded:: 0.9

Methods
-------
__call__

Parameters
----------
x : (npoints, ndims) 2-D ndarray of floats
    Data point coordinates.
y : (npoints, ) 1-D 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

See Also
--------
griddata :
    Interpolate unstructured D-D data.
LinearNDInterpolator :
    Piecewise linear interpolator in N dimensions.
CloughTocher2DInterpolator :
    Piecewise cubic, C1 smooth, curvature-minimizing interpolator in 2D.
interpn : Interpolation on a regular grid or rectilinear grid.
RegularGridInterpolator : Interpolator on a regular or rectilinear grid
                          in arbitrary dimensions (`interpn` wraps this
                          class).

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

.. note:: For data on a regular grid use `interpn` instead.

Examples
--------
We can interpolate values on a 2D plane:

>>> from scipy.interpolate import NearestNDInterpolator
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> rng = np.random.default_rng()
>>> x = rng.random(10) - 0.5
>>> y = rng.random(10) - 0.5
>>> z = np.hypot(x, y)
>>> X = np.linspace(min(x), max(x))
>>> Y = np.linspace(min(y), max(y))
>>> X, Y = np.meshgrid(X, Y)  # 2D grid for interpolation
>>> interp = NearestNDInterpolator(list(zip(x, y)), z)
>>> Z = interp(X, Y)
>>> plt.pcolormesh(X, Y, Z, shading='auto')
>>> plt.plot(x, y, "ok", label="input point")
>>> plt.legend()
>>> plt.colorbar()
>>> plt.axis("equal")
>>> plt.show()

Nc           	          [         R                  " XX#SSS9  Uc
  [        5       n[        U R                  40 UD6U l        [        R                  " U5      U l        g )NF)rescaleneed_contiguousneed_values)	r   __init__dictr   pointstreenpasarrayvalues)selfxyr   tree_optionss        P/var/www/html/venv/lib/python3.13/site-packages/scipy/interpolate/_ndgriddata.pyr   NearestNDInterpolator.__init__\   sM    ##DQ4905	7 6LDKK8<8	jjm    c                    [        XR                  R                  S   S9nU R                  U5      nU R	                  U5      nUR                  SUR                  S   5      nUR                  nUR                  nU R                  R                  " U40 UD6u  px[        R                  " U5      n	U R                  R                  S:  a   USS U R                  R                  SS -   n
OUSS n
[        R                  " U R                  R                  [        R                  5      (       a9  [        R                  " U
[        R                   U R                  R                  S9nO%[        R                  " U
[        R                   5      nU R                  X   S4   X'   U R                  R                  S:  a   USS U R                  R                  SS -   nOUSS nUR                  U5      nU$ )a%  
Evaluate interpolator at given points.

Parameters
----------
x1, x2, ... xn : array-like of float
    Points where to interpolate data at.
    x1, x2, ... xn can be array-like of float with broadcastable shape.
    or x1 can be array-like of float with shape ``(..., ndim)``
**query_options
    This allows ``eps``, ``p``, ``distance_upper_bound``, and ``workers``
    being passed to the cKDTree's query function to be explicitly set.
    See `scipy.spatial.cKDTree.query` for an overview of the different options.

    .. versionadded:: 1.12.0

r   )ndimN)dtype.)r   r   shape_check_call_shape_scale_xreshaper   queryr   isfiniter   r    
issubdtyper"   complexfloatingfullnan)r   argsquery_optionsxixi_flatoriginal_shapeflattened_shapedisti
valid_maskinterp_shapeinterp_values	new_shapes                r   __call__NearestNDInterpolator.__call__e   s   * &d1B1B11EF##B']]2 **R".!-- ))//';];[[&
 ;;a*3B/$++2C2CAB2GGL*3B/L==**B,>,>??GGL"&&@Q@QRMGGL"&&9M$(KKs0B$C!;;a&s+dkk.?.?.CCI&s+I%--i8r   )r   r   )FN)__name__
__module____qualname____firstlineno____doc__r   r9   __static_attributes__ r   r   r
   r
      s    EN$Ar   r
   linearFc           	      H   [        U 5      n U R                  S:  a  U R                  nOU R                  S   nUS:X  a  US;   a  SSKJn  U R                  5       n [        U[        5      (       a  [        U5      S:w  a  [        S5      eUu  n[        R                  " U 5      nX   n X   nUS:X  a  SnU" XUS	S
US9n	U	" U5      $ US:X  a  [        XUS9n	U	" U5      $ US:X  a  [        XUUS9n	U	" U5      $ US:X  a  US:X  a  [        XUUS9n	U	" U5      $ [        SX64-  5      e)a  
Interpolate unstructured D-D 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-D
      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.

See Also
--------
LinearNDInterpolator :
    Piecewise linear interpolator in N dimensions.
NearestNDInterpolator :
    Nearest-neighbor interpolator in N dimensions.
CloughTocher2DInterpolator :
    Piecewise cubic, C1 smooth, curvature-minimizing interpolator in 2D.
interpn : Interpolation on a regular grid or rectilinear grid.
RegularGridInterpolator : Interpolator on a regular or rectilinear grid
                          in arbitrary dimensions (`interpn` wraps this
                          class).

Notes
-----

.. versionadded:: 0.9

.. note:: For data on a regular grid use `interpn` instead.

Examples
--------

Suppose we want to interpolate the 2-D function

>>> import numpy as np
>>> 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:

>>> rng = np.random.default_rng()
>>> points = rng.random((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!   r   )nearestrB   cubic)interp1dz"invalid number of dimensions in xirE   extrapolater   F)kindaxisbounds_error
fill_value)r   rB   )rL   r   rF   z7Unknown interpolation method %r for %d dimensional data)r   r    r#   _interpolaterG   ravel
isinstancetuplelen
ValueErrorr   argsortr
   r   r   )
r   r   r/   methodrL   r   r    rG   idxips
             r   r	   r	      sF   t &f-F{{Q{{||BqyV==*b%  2w!| !EFFCBjj Y&Jf6!+-"v	9	"67C"v	8	!&Z*13"v	7	tqy':079"v /28@ A 	Ar   )r?   numpyr   	_interpndr   r   r   r   scipy.spatialr   __all__r
   r,   r	   rA   r   r   <module>r[      sH    ; ; !)R. Rt )1RVV^Ar   