class_docstr: PCHIP 1-d monotonic cubic interpolation.
  
  `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
      A 1-D array of monotonically increasing real values.  `x` cannot
      include duplicate values (otherwise f is overspecified)
  y : ndarray
      A 1-D array of real values. `y`'s length along the interpolation
      axis must be equal to the length of `x`. If N-D array, use `axis`
      parameter to select correct axis.
  axis : int, optional
      Axis in the y array corresponding to the x-coordinate values.
  extrapolate : bool, optional
      Whether to extrapolate to out-of-bounds points based on first
      and last intervals, or to return NaNs.
  
  Methods
  -------
  __call__
  derivative
  antiderivative
  roots
  
  See Also
  --------
  Akima1DInterpolator
  CubicSpline
  BPoly
  
  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 :math:`x_k`.
  
  Determines the derivatives at the points :math:`x_k`, :math:`f'_k`,
  by using PCHIP algorithm [1]_.
  
  Let :math:`h_k = x_{k+1} - x_k`, and  :math:`d_k = (y_{k+1} - y_k) / h_k`
  are the slopes at internal points :math:`x_k`.
  If the signs of :math:`d_k` and :math:`d_{k-1}` are different or either of
  them equals zero, then :math:`f'_k = 0`. Otherwise, it is given by the
  weighted harmonic mean
  
  .. math::
  
      \frac{w_1 + w_2}{f'_k} = \frac{w_1}{d_{k-1}} + \frac{w_2}{d_k}
  
  where :math:`w_1 = 2 h_k + h_{k-1}` and :math:`w_2 = h_k + 2 h_{k-1}`.
  
  The end slopes are set using a one-sided scheme [2]_.
  
  
  References
  ----------
  .. [1] F. N. Fritsch and R. E. Carlson, Monotone Piecewise Cubic Interpolation,
         SIAM J. Numer. Anal., 17(2), 238 (1980).
         :doi:`10.1137/0717021`.
  .. [2] see, e.g., C. Moler, Numerical Computing with Matlab, 2004.
         :doi:`10.1137/1.9780898717952`
class_docstr_tok: ["PCHIP","1-d","monotonic","cubic","interpolation",".","`","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","A","1-D","array","of","monotonically","increasing","real","values",".","`","x","`","can","not","include","duplicate","values","(","otherwise","f","is","overspecified",")","y",":","ndarray","A","1-D","array","of","real","values",".","`","y","`","'s","length","along","the","interpolation","axis","must","be","equal","to","the","length","of","`","x","`",".","If","N-D","array",",","use","`","axis","`","parameter","to","select","correct","axis",".","axis",":","int",",","optional","Axis","in","the","y","array","corresponding","to","the","x-coordinate","values",".","extrapolate",":","bool",",","optional","Whether","to","extrapolate","to","out-of-bounds","points","based","on","first","and","last","intervals",",","or","to","return","NaNs",".","Methods","--","--","--","-","__call__","derivative","antiderivative","roots","See","Also","--","--","--","--","Akima1DInterpolator","CubicSpline","BPoly","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",":","math",":","`","x_k","`",".","Determines","the","derivatives","at","the","points",":","math",":","`","x_k","`",",",":","math",":","`","f'_k","`",",","by","using","PCHIP","algorithm","[","1","]","_",".","Let",":","math",":","`","h_k","=","x_","{","k+1","}","-","x_k","`",",","and",":","math",":","`","d_k","=","(","y_","{","k+1","}","-","y_k",")","\/","h_k","`","are","the","slopes","at","internal","points",":","math",":","`","x_k","`",".","If","the","signs","of",":","math",":","`","d_k","`","and",":","math",":","`","d_","{","k-1","}","`","are","different","or","either","of","them","equals","zero",",","then",":","math",":","`","f'_k","=","0","`",".","Otherwise",",","it","is","given","by","the","weighted","harmonic","mean","..","math",":",":","\\frac","{","w_1","+","w_2","}","{","f'_k","}","=","\\frac","{","w_1","}","{","d_","{","k-1","}","}","+","\\frac","{","w_2","}","{","d_k","}","where",":","math",":","`","w_1","=","2","h_k","+","h_","{","k-1","}","`","and",":","math",":","`","w_2","=","h_k","+","2","h_","{","k-1","}","`",".","The","end","slopes","are","set","using","a","one-sided","scheme","[","2","]","_.","References","--","--","--","--","--","..","[","1","]","F.","N.","Fritsch","and","R.","E.","Carlson",",","Monotone","Piecewise","Cubic","Interpolation",",","SIAM","J.","Numer",".","Anal.",",","17","(","2",")",",","238","(","1980",")",".",":","doi",":","`","10.1137\/0717021","`",".","..","[","2","]","see",",","e.g.",",","C.","Moler",",","Numerical","Computing","with","Matlab",",","2004.",":","doi",":","`","10.1137\/1.9780898717952","`"]
code: def _find_derivatives(x, y):
      # Determine the derivatives at the points y_k, d_k, by using
      #  PCHIP algorithm is:
      # We choose the derivatives at the point x_k by
      # Let m_k be the slope of the kth segment (between k and k+1)
      # If m_k=0 or m_{k-1}=0 or sgn(m_k) != sgn(m_{k-1}) then d_k == 0
      # else use weighted harmonic mean:
      #   w_1 = 2h_k + h_{k-1}, w_2 = h_k + 2h_{k-1}
      #   1/d_k = 1/(w_1 + w_2)*(w_1 / m_k + w_2 / m_{k-1})
      #   where h_k is the spacing between x_k and x_{k+1}
      y_shape = y.shape
      if y.ndim == 1:
          # So that _edge_case doesn't end up assigning to scalars
          x = x[:, None]
          y = y[:, None]
  
      hk = x[1:] - x[:-1]
      mk = (y[1:] - y[:-1]) / hk
  
      if y.shape[0] == 2:
          # edge case: only have two points, use linear interpolation
          dk = np.zeros_like(y)
          dk[0] = mk
          dk[1] = mk
          return dk.reshape(y_shape)
  
      smk = np.sign(mk)
      condition = (smk[1:] != smk[:-1]) | (mk[1:] == 0) | (mk[:-1] == 0)
  
      w1 = 2 * hk[1:] + hk[:-1]
      w2 = hk[1:] + 2 * hk[:-1]
  
      # values where division by zero occurs will be excluded
      # by 'condition' afterwards
      with np.errstate(divide="ignore"):
          whmean = (w1 / mk[:-1] + w2 / mk[1:]) / (w1 + w2)
  
      dk = np.zeros_like(y)
      dk[1:-1][condition] = 0.0
      dk[1:-1][~condition] = 1.0 / whmean[~condition]
  
      # special case endpoints, as suggested in
      # Cleve Moler, Numerical Computing with MATLAB, Chap 3.4
      dk[0] = PchipInterpolator._edge_case(hk[0], hk[1], mk[0], mk[1])
      dk[-1] = PchipInterpolator._edge_case(
          hk[-1], hk[-2], mk[-1], mk[-2]
      )
  
      return dk.reshape(y_shape)
  
imports: from __future__ import division, print_function, absolute_import
  import numpy
  from scipy._lib.six import string_types
  from .None import BPoly, PPoly
  from .polyint import _isscalar
  from scipy._lib._util import _asarray_validated
  from scipy.linalg import solve_banded, solve
label_desc: Use image node_id 4 for calling the PchipInterpolator obj's underlying member method code with example usage: obj._find_derivatives(x, y) and returns: dk, dk