code: def blob_data_to_dict(stat_names, blobs):
      
      # get the dtypes of each of the stats; we'll just take this from the
      # first iteration and walker
      dtypes = [type(val) for val in blobs[0][0]]
      assert len(stat_names) == len(dtypes), (
          "number of stat names must match length of tuples in the blobs")
      # convert to an array; to ensure that we get the dtypes correct, we'll
      # cast to a structured array
      raw_stats = numpy.array(blobs, dtype=zip(stat_names, dtypes))
      # transpose so that it has shape nwalkers x niterations
      raw_stats = raw_stats.transpose()
      # now return as a dictionary
      return {stat: raw_stats[stat] for stat in stat_names}
docs: Converts list of "blobs" to a dictionary of model stats.
  
      Samplers like ``emcee`` store the extra tuple returned by ``CallModel`` to
      a list called blobs. This is a list of lists of tuples with shape
      niterations x nwalkers x nstats, where nstats is the number of stats
      returned by the model's ``default_stats``. This converts that list to a
      dictionary of arrays keyed by the stat names.
  
      Parameters
      ----------
      stat_names : list of str
          The list of the stat names.
      blobs : list of list of tuples
          The data to convert.
  
      Returns
      -------
      dict :
          A dictionary mapping the model's ``default_stats`` to arrays of values.
          Each array will have shape ``nwalkers x niterations``.