docs: def derivatives(self, x, y, grid_interp_x=None, grid_interp_y=None, f_=None, f_x=None, f_y=None, f_xx=None, f_yy=None, f_xy=None):
          """
          returns df/dx and df/dy of the function
          """
          #self._check_interp(grid_interp_x, grid_interp_y, f_, f_x, f_y, f_xx, f_yy, f_xy)
          n = len(np.atleast_1d(x))
          if n <= 1 and np.shape(x) == ():
          #if type(x) == float or type(x) == int or type(x) == type(np.float64(1)) or len(x) <= 1:
              f_x_out = self.f_x_interp(x, y, grid_interp_x, grid_interp_y, f_x)
              f_y_out = self.f_y_interp(x, y, grid_interp_x, grid_interp_y, f_y)
              return f_x_out[0][0], f_y_out[0][0]
          else:
              if self._grid and n >= self._min_grid_number:
                  x_, y_ = util.get_axes(x, y)
                  f_x_out = self.f_x_interp(x_, y_, grid_interp_x, grid_interp_y, f_x)
                  f_y_out = self.f_y_interp(x_, y_, grid_interp_x, grid_interp_y, f_y)
                  f_x_out = util.image2array(f_x_out)
                  f_y_out = util.image2array(f_y_out)
              else:
                  #n = len(x)
                  f_x_out, f_y_out = np.zeros(n), np.zeros(n)
                  for i in range(n):
                      f_x_out[i] = self.f_x_interp(x[i], y[i], grid_interp_x, grid_interp_y, f_x)
                      f_y_out[i] = self.f_y_interp(x[i], y[i], grid_interp_x, grid_interp_y, f_y)
          return f_x_out, f_y_out