code: def do_kernel(x0, x, l=1.0, kernel=epanechnikov):
      
      # xx is the norm of x-x0. Note that we broadcast on the second axis for the
      # nd case and then sum on the first to get the norm in each value of x:
      xx = np.sum(np.sqrt(np.power(x-x0[:,np.newaxis], 2)), 0)
      idx = np.where(np.abs(xx<=1))
      return kernel(xx,idx)/l
docs: Calculate a kernel function on x in the neighborhood of x0
  
      Parameters
      ----------
      x: float array
         All values of x
      x0: float
         The value of x around which we evaluate the kernel
      l: float or float array (with shape = x.shape)
         Width parameter (metric window size)