[SciPy-user] histogram(a, normed=True) doesn't normalize?

Martin Spacek scipy at mspacek.mm.st
Mon Jun 19 04:02:57 CDT 2006

I've searched around on this and I can't find anything. I'm confused by 
the 'normed' argument in histogram(). According to the numpy book:

"If normed is True, then the histogram will be normalized and comparable 
with a probability density function, otherwise it will be a count of the 
number of items in each bin."

The sum of the heights of all the bins should be 1 for a PDF (right?). 
But I get the following in numpy 0.9.8:

 >>> import numpy as np
 >>> np.histogram([1,2,3], bins=3, normed=False)
(array([1, 1, 1]), array([ 1.,  1.66666667,  2.33333333]))
 >>> np.histogram([1,2,3], bins=3, normed=True)
(array([ 0.5,  0.5,  0.5]), array([ 1.,  1.66666667,  2.33333333]))

Adding up the bins gives 1.5 in this case. Here's the code:


def histogram(a, bins=10, range=None, normed=False):
     a = asarray(a).ravel()
     if not iterable(bins):
         if range is None:
             range = (a.min(), a.max())
         mn, mx = [mi+0.0 for mi in range]
         if mn == mx:
             mn -= 0.5
             mx += 0.5
         bins = linspace(mn, mx, bins, endpoint=False)

     n = sort(a).searchsorted(bins)
     n = concatenate([n, [len(a)]])
     n = n[1:]-n[:-1]

     if normed:
         db = bins[1] - bins[0]
         return 1.0/(a.size*db) * n, bins
         return n, bins

 From what I can tell, normed normalizes n by the total span of the 
bins, which seems an odd thing to do. Here's my interpretation of what 
it should do:

     if normed:
         return 1.0/sum(n) * n, bins
         return n, bins

which then gives me:

 >>> np.histogram([1,2,3], bins=3, normed=True)
(array([ 0.33333333,  0.33333333,  0.33333333]), array([ 1., 
1.66666667,  2.33333333]))

Which adds to 1. Am I way off on this?



More information about the SciPy-user mailing list