Source code for gsw.utility

"""
Functions not specific to the TEOS-10 realm of variables.
"""

import numpy as np

from . import _gsw_ufuncs
from ._utilities import match_args_return, indexer

[docs]@match_args_return def pchip_interp(x, y, xi, axis=0): """ Interpolate using Piecewise Cubic Hermite Interpolating Polynomial This is a shape-preserving algorithm; it does not introduce new local extrema. The implementation in C that is wrapped here is largely taken from the scipy implementation, https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.PchipInterpolator.html. Points outside the range of the interpolation table are filled using the end values in the table. (In contrast, scipy.interpolate.pchip_interpolate() extrapolates using the end polynomials.) Parameters ---------- x, y : array-like Interpolation table x and y; n-dimensional, must be broadcastable to the same dimensions. xi : array-like One-dimensional array of new x values. axis : int, optional, default is 0 Axis along which xi is taken. Returns ------- yi : array Values of y interpolated to xi along the specified axis. """ xi = np.array(xi, dtype=float, copy=False, order='C', ndmin=1) if xi.ndim > 1: raise ValueError('xi must be no more than 1-dimensional') nxi = xi.size x, y = np.broadcast_arrays(x, y) shape0 = x.shape out_shape = list(x.shape) out_shape[axis] = nxi yi = np.empty(out_shape, dtype=float) yi.fill(np.nan) goodmask = ~(np.isnan(x) | np.isnan(y)) order = 'F' if y.flags.fortran else 'C' for ind in indexer(y.shape, axis, order=order): igood = goodmask[ind] # If p_ref is below the deepest value, skip the profile. xgood = x[ind][igood] ygood = y[ind][igood] yi[ind] = _gsw_ufuncs.util_pchip_interp(xgood, ygood, xi) return yi