L i$/tdZddlZddlmZmZmZmZddlm Z gdZ GddeZ d ejd fd Z y) zD Convenience interface to N-D interpolation .. versionadded:: 0.9 N)LinearNDInterpolatorNDInterpolatorBaseCloughTocher2DInterpolator_ndim_coords_from_arrays)cKDTree)griddataNearestNDInterpolatorrrceZdZdZddZdZy)r aNearest-neighbor interpolator in N > 1 dimensions. 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() Nctj||||dd| t}t|jfi||_t j||_y)NF)rescaleneed_contiguous need_values) r__init__dictrpointstreenpasarrayvalues)selfxyr tree_optionss c/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/scipy/interpolate/_ndgriddata.pyrzNearestNDInterpolator.__init__XsQ##D!Q4905 7  6LDKK8<8 jjm ct||jjd}|j|}|j |}|j d|jd}|j}|j}|j j|fi|\}}tj|} |jjdkDr |dd|jjddz} n|dd} tj|jjtjr;tj| tj |jj} n$tj| tj } |j|| df| | <|jjdkDr |dd|jjddz} n|dd} | j | } | S)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.)rrshape_check_call_shape_scale_xreshaperqueryrisfiniterr issubdtyper complexfloatingfullnan) rargs query_optionsxixi_flatoriginal_shapeflattened_shapedisti valid_mask interp_shape interp_values new_shapes r__call__zNearestNDInterpolator.__call__as*&d1B1B11E F  # #B ' ]]2 **R".!--"$))//';];a[[&  ;;  a *3B/$++2C2CAB2GGL*3B/L ==**B,>,> ?GGL"&& @Q@QRMGGL"&&9M$(KK* s0B$C j! ;;  a &s+dkk.?.?.CCI&s+I%--i8 r)FN)__name__ __module__ __qualname____doc__rr7rrr r sAF$Arr linearFcRt|}|jdkr |j}n|jd}|dk(r|dvrddlm}|j }t |trt|dk7r td|\}tj|}||}||}|dk(rd}||||d d | } | |S|dk(rt||| } | |S|d k(rt||||} | |S|dk(r|dk(rt||||} | |Std|d|d)a Convenience function for interpolating unstructured data in multiple dimensions. 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() rr)nearestr=cubic)interp1dz"invalid number of dimensions in xir@ extrapolaterF)kindaxis bounds_error fill_value)r r=)rGr rAzUnknown interpolation method z for z dimensional data)rrr! _interpolaterBravel isinstancetuplelen ValueErrorrargsortr rr) rrr-methodrGr rrBidxips rr r sPt&f -F {{Q{{||B qyV==* b% 2w!| !EFFCBjj  Y &J ff6!+-"v 9  "667 C"v 8  !&&Z*13"v 7 tqy ':079"v +F:U4&@Q R  r)r;numpyr _interpndrrrr scipy.spatialr__all__r r*r r<rrrVsG ;;! )N.Nl)1RVV_ r