Skip to main content
`Ctrl`+`K`
scipy.interpolate.

# PchipInterpolator

class scipy.interpolate.PchipInterpolator(x, y, axis=0, extrapolate=None)

  PCHIP shape-preserving interpolator (C1 smooth).

  `x` and `y` are arrays of values used to approximate some function f, with `y = f(x)`. The interpolant uses monotonic cubic splines to find the value of new points. (PCHIP stands for Piecewise Cubic Hermite Interpolating Polynomial).

  Parameters:
    x ndarray, shape (npoints, )

      A 1-D array of monotonically increasing real values. `x` cannot include duplicate values (otherwise f is overspecified)

    y ndarray, shape (…, npoints, …)

      An N-D array of real values. `y`’s length along the interpolation axis must be equal to the length of `x`. Use the `axis` parameter to select the interpolation axis.

    axis int, optional

      Axis in the `y` array corresponding to the x-coordinate values. Defaults to `axis=0`.

    extrapolate bool, optional

      Whether to extrapolate to out-of-bounds points based on first and last intervals, or to return NaNs.

  Attributes:
    axis
    c
    extrapolate
    x

  Methods

  `__call__`(x[, nu, extrapolate]) | Evaluate the piecewise polynomial or its derivative.
  `derivative`([nu]) | Construct a new piecewise polynomial representing the derivative.
  `antiderivative`([nu]) | Construct a new piecewise polynomial representing the antiderivative.
  `integrate`(a, b[, extrapolate]) | Compute a definite integral over a piecewise polynomial.
  `solve`([y, discontinuity, extrapolate]) | Find real solutions of the equation `pp(x) == y`.
  `roots`([discontinuity, extrapolate]) | Find real roots of the piecewise polynomial.

  See also

  `CubicHermiteSpline`

    Piecewise-cubic interpolator.

  `Akima1DInterpolator`

    Akima 1D interpolator.

  `CubicSpline`

    Cubic spline data interpolator.

  `PPoly`

    Piecewise polynomial in terms of coefficients and breakpoints.

  Notes

  The interpolator preserves monotonicity in the interpolation data and does not overshoot if the data is not smooth.

  The first derivatives are guaranteed to be continuous, but the second derivatives may jump at \(x_k\).

  Determines the derivatives at the points \(x_k\), \(f'_k\), by using PCHIP algorithm [1].

  Let \(h_k = x_{k+1} - x_k\), and \(d_k = (y_{k+1} - y_k) / h_k\) are the slopes at internal points \(x_k\). If the signs of \(d_k\) and \(d_{k-1}\) are different or either of them equals zero, then \(f'_k = 0\). Otherwise, it is given by the weighted harmonic mean

  \[\frac{w_1 + w_2}{f'_k} = \frac{w_1}{d_{k-1}} + \frac{w_2}{d_k}\]

  where \(w_1 = 2 h_k + h_{k-1}\) and \(w_2 = h_k + 2 h_{k-1}\).

  The end slopes are set using a one-sided scheme [2].

  Array API Standard Support

  `PchipInterpolator` has experimental support for Python Array API Standard compatible backends in addition to NumPy. Please consider testing these features by setting an environment variable `SCIPY_ARRAY_API=1` and providing CuPy, PyTorch, JAX, or Dask arrays as array arguments. The following combinations of backend and device (or other capability) are supported.

  Library | CPU | GPU
  --- | --- | ---
  NumPy | ✅ | n/a
  CuPy | n/a | ⛔
  PyTorch | ✅ | ⛔
  JAX | ⚠️ no JIT | ⛔
  Dask | ⛔ | n/a

  > See Support for the array API standard for more information.

  References

  [1]

  F. N. Fritsch and J. Butland, A method for constructing local monotone piecewise cubic interpolants, SIAM J. Sci. Comput., 5(2), 300-304 (1984). DOI:10.1137/0905021.

  [2]

  C. Moler, Numerical Computing with Matlab, 2004. DOI:10.1137/1.9780898717952