title: Numpy Histogram - Python
body: <p>I have a problem in which a have a bunch of images for which I have to generate histograms. But I have to generate an histogram for each pixel. I.e, for a collection of n images, I have to count the values that the pixel 0,0 assumed and generate an histogram, the same for 0,1, 0,2 and so on. I coded the following method to do this:</p>
  
  <pre><code>class ImageData:
      def generate_pixel_histogram(self, images, bins):
      """
      Generate a histogram of the image for each pixel, counting
      the values assumed for each pixel in a specified bins
      """
          max_value = 0.0
          min_value = 0.0
          for i in range(len(images)):
              image = images[i]
              max_entry = max(max(p[1:]) for p in image.data)
              min_entry = min(min(p[1:]) for p in image.data)
              if max_entry &gt; max_value:
                  max_value = max_entry
              if min_entry &lt; min_value:
                  min_value = min_entry
  
          interval_size = (math.fabs(min_value) + math.fabs(max_value))/bins
  
          for x in range(self.width):
              for y in range(self.height):
                  pixel_histogram = {}
                  for i in range(bins+1):
                      key = round(min_value+(i*interval_size), 2)
                      pixel_histogram[key] = 0.0
                  for i in range(len(images)):
                      image = images[i]
                      value = round(Utils.get_bin(image.data[x][y], interval_size), 2)
                      pixel_histogram[value] += 1.0/len(images)
                  self.data[x][y] = pixel_histogram    
  </code></pre>
  
  <p>Where each position of a matrix store a dictionary representing an histogram. But, how I do this for each pixel, and this calculus take a considerable time, this seems to me to be a good problem to be parallelized. But I don't have experience with this and I don't know how to do this.</p>
  
  <p>EDIT:</p>
  
  <p>I tried what @Eelco Hoogendoorn told me and it works perfectly. But applying it to my code, where the data are a large number of images generated with this constructor (after the values are calculated and not just 0 anymore), I just got as h an array of zeros [0 0 0]. What I pass to the histogram method is an array of ImageData.</p>
  
  <pre><code>class ImageData(object):
  
      def __init__(self, width=5, height=5, range_min=-1, range_max=1):
          """
          The ImageData constructor
          """
          self.width = width
          self.height = height
          #The values range each pixel can assume
          self.range_min = range_min
          self.range_max = range_max
          self.data = np.arange(width*height).reshape(height, width)
  
  #Another class, just the method here
  def generate_pixel_histogram(realizations, bins):
      """
      Generate a histogram of the image for each pixel, counting
      the values assumed for each pixel in a specified bins
      """
      data = np.array([image.data for image in realizations])
      min_max_range = data.min(), data.max()+1
  
      bin_boundaries = np.empty(bins+1)
  
      # Function to wrap np.histogram, passing on only the first return value
      def hist(pixel):
          h, b = np.histogram(pixel, bins=bins, range=min_max_range)
          bin_boundaries[:] = b
          return h
  
      # Apply this for each pixel
      hist_data = np.apply_along_axis(hist, 0, data)
      print hist_data
      print bin_boundaries
  </code></pre>
  
  <p>Now I get:</p>
  
  <pre><code>  hist_data = np.apply_along_axis(hist, 0, data)
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/lib/shape_base.py", line 104, in apply_along_axis
    outshape[axis] = len(res)
    TypeError: object of type 'NoneType' has no len()
  </code></pre>
  
  <p>Any help would be appreciated.
  Thanks in advance.</p>