code: def histogram(a, bins=10, range=None, **kwargs):
      """Enhanced histogram
  
      This is a histogram function that enables the use of more sophisticated
      algorithms for determining bins.  Aside from the `bins` argument allowing
      a string specified how bins are computed, the parameters are the same
      as numpy.histogram().
  
      Parameters
      ----------
      a : array_like
          array of data to be histogrammed
  
      bins : int or list or str (optional)
          If bins is a string, then it must be one of:
          'blocks' : use bayesian blocks for dynamic bin widths
          'knuth' : use Knuth's rule to determine bins
          'scotts' : use Scott's rule to determine bins
          'freedman' : use the Freedman-diaconis rule to determine bins
  
      range : tuple or None (optional)
          the minimum and maximum range for the histogram.  If not specified,
          it will be (x.min(), x.max())
  
      other keyword arguments are described in numpy.hist().
  
      Returns
      -------
      hist : array
          The values of the histogram. See `normed` and `weights` for a
          description of the possible semantics.
      bin_edges : array of dtype float
          Return the bin edges ``(length(hist)+1)``.
  
      See Also
      --------
      numpy.histogram
      astroML.plotting.hist
      """
      a = np.asarray(a)
  
      # if range is specified, we need to truncate the data for
      # the bin-finding routines
      if range is not None and (
          bins in ["blocks", "knuth", "scotts", "freedman"]
      ):
          a = a[(a >= range[0]) & (a <= range[1])]
  
      if isinstance(bins, str):
          if bins == "blocks":
              bins = astropy_stats.bayesian_blocks(a)
          elif bins == "knuth":
              da, bins = astropy_stats.knuth_bin_width(a, True)
          elif bins == "scotts":
              da, bins = astropy_stats.scott_bin_width(a, True)
          elif bins == "freedman":
              da, bins = astropy_stats.freedman_bin_width(a, True)
          else:
              raise ValueError(
                  "unrecognized bin code: '{}'".format(bins)
              )
  
      return np.histogram(a, bins, range, **kwargs)
  
file_path: astroML/astroML/density_estimation/histtools.py
imports: import numpy
  from scipy.special import gammaln
  from astropy import stats
  from astroML.utils import deprecated
  from astroML.utils.exceptions import AstroMLDeprecationWarning
label_desc: Use image node_id 4 for calling a global function with example usage: histogram(a, bins, range) and returns: np