code: def coarsen_array(a, level=2, method='mean'):
      
      if a is None: return None    
      
      # make sure it's a numpy array
      a = _n.array(a)
      
      # quickest option
      if level in [0,1,False]: return a
  
      # otherwise assemble the python code to execute
      code = 'a.reshape(-1, level).'+method+'(axis=1)'
  
      # execute, making sure the array can be reshaped!
      try: return eval(code, dict(a=a[0:int(len(a)/level)*level], level=level))
      except:
          print("ERROR: Could not coarsen array with method "+repr(method))
          return a
docs: Returns a coarsened (binned) version of the data. Currently supports
      any of the numpy array operations, e.g. min, max, mean, std, ...
      
      level=2 means every two data points will be binned.
      level=0 or 1 just returns a copy of the array