Python 浮点的标准化直方图:numpy/matplotlib中的意外行为

Python 浮点的标准化直方图:numpy/matplotlib中的意外行为,python,numpy,matplotlib,Python,Numpy,Matplotlib,那么,就这么定了。我有一个很大的介于0和1之间的浮动数组。我想要一个1-d浮点数数组,用于计算特定容器中有多少实例。在单位间隔内有32个料箱均匀分布 我原以为一个标准化的柱状图可以满足我的要求,但我有一些令人费解的行为。基本上,标准化直方图应该返回我想要的(我会认为),但它抛出的值超出了[0,1] >>> from numpy import * >>> import matplotlib. pyplot as plt >>> a = rand

那么,就这么定了。我有一个很大的介于0和1之间的浮动数组。我想要一个1-d浮点数数组,用于计算特定容器中有多少实例。在单位间隔内有32个料箱均匀分布

我原以为一个标准化的柱状图可以满足我的要求,但我有一些令人费解的行为。基本上,标准化直方图应该返回我想要的(我会认为),但它抛出的值超出了[0,1]

>>> from numpy import *
>>> import matplotlib. pyplot as plt
>>> a = random.normal(0.4,0.1,1024)
>>> plt.hist(a, bins=32,range = ([0,1]),normed=True)
(array([ 0.     ,  0.     ,  0.0625 ,  0.03125,  0.15625,  0.40625,
        0.5    ,  1.     ,  2.0625 ,  2.     ,  3.125  ,  3.65625,
        3.78125,  4.3125 ,  3.3125 ,  2.59375,  1.8125 ,  1.40625,
        0.90625,  0.34375,  0.375  ,  0.0625 ,  0.0625 ,  0.03125,
        0.     ,  0.     ,  0.     ,  0.     ,  0.     ,  0.     ,
        0.     ,  0.     ]), array([ 0.     ,  0.03125,  0.0625 ,  0.09375,  0.125  ,  0.15625,
        0.1875 ,  0.21875,  0.25   ,  0.28125,  0.3125 ,  0.34375,
        0.375  ,  0.40625,  0.4375 ,  0.46875,  0.5    ,  0.53125,
        0.5625 ,  0.59375,  0.625  ,  0.65625,  0.6875 ,  0.71875,
        0.75   ,  0.78125,  0.8125 ,  0.84375,  0.875  ,  0.90625,
        0.9375 ,  0.96875,  1.     ]), <a list of 32 Patch objects>)
>>> histogram(a, bins=32,range = ([0,1]),density=True)
(array([ 0.     ,  0.     ,  0.0625 ,  0.03125,  0.15625,  0.40625,
        0.5    ,  1.     ,  2.0625 ,  2.     ,  3.125  ,  3.65625,
        3.78125,  4.3125 ,  3.3125 ,  2.59375,  1.8125 ,  1.40625,
        0.90625,  0.34375,  0.375  ,  0.0625 ,  0.0625 ,  0.03125,
        0.     ,  0.     ,  0.     ,  0.     ,  0.     ,  0.     ,
        0.     ,  0.     ]), array([ 0.     ,  0.03125,  0.0625 ,  0.09375,  0.125  ,  0.15625,
        0.1875 ,  0.21875,  0.25   ,  0.28125,  0.3125 ,  0.34375,
        0.375  ,  0.40625,  0.4375 ,  0.46875,  0.5    ,  0.53125,
        0.5625 ,  0.59375,  0.625  ,  0.65625,  0.6875 ,  0.71875,
        0.75   ,  0.78125,  0.8125 ,  0.84375,  0.875  ,  0.90625,
        0.9375 ,  0.96875,  1.     ]))
来自numpy导入的
>>*
>>>导入matplotlib。pyplot作为plt
>>>a=随机。正常(0.4,0.11024)
>>>plt.hist(a,bin=32,range=([0,1]),normed=True)
(数组([0,0,0.0625,0.03125,0.15625,0.40625,
0.5    ,  1.     ,  2.0625 ,  2.     ,  3.125  ,  3.65625,
3.78125,  4.3125 ,  3.3125 ,  2.59375,  1.8125 ,  1.40625,
0.90625,  0.34375,  0.375  ,  0.0625 ,  0.0625 ,  0.03125,
0.     ,  0.     ,  0.     ,  0.     ,  0.     ,  0.     ,
阵列([0,0.03125,0.0625,0.09375,0.125,0.15625,
0.1875 ,  0.21875,  0.25   ,  0.28125,  0.3125 ,  0.34375,
0.375  ,  0.40625,  0.4375 ,  0.46875,  0.5    ,  0.53125,
0.5625 ,  0.59375,  0.625  ,  0.65625,  0.6875 ,  0.71875,
0.75   ,  0.78125,  0.8125 ,  0.84375,  0.875  ,  0.90625,
0.9375 ,  0.96875,  1.     ]), )
>>>柱状图(a,仓位=32,范围=([0,1]),密度=真)
(数组([0,0,0.0625,0.03125,0.15625,0.40625,
0.5    ,  1.     ,  2.0625 ,  2.     ,  3.125  ,  3.65625,
3.78125,  4.3125 ,  3.3125 ,  2.59375,  1.8125 ,  1.40625,
0.90625,  0.34375,  0.375  ,  0.0625 ,  0.0625 ,  0.03125,
0.     ,  0.     ,  0.     ,  0.     ,  0.     ,  0.     ,
阵列([0,0.03125,0.0625,0.09375,0.125,0.15625,
0.1875 ,  0.21875,  0.25   ,  0.28125,  0.3125 ,  0.34375,
0.375  ,  0.40625,  0.4375 ,  0.46875,  0.5    ,  0.53125,
0.5625 ,  0.59375,  0.625  ,  0.65625,  0.6875 ,  0.71875,
0.75   ,  0.78125,  0.8125 ,  0.84375,  0.875  ,  0.90625,
0.9375 ,  0.96875,  1.     ]))
事实上,这种行为不仅仅适用于小型浮动。如果你把正态分布集中在,比如说,7.4上,然后把范围扩大到[7,8],你会得到同样令人费解的行为

使用
numpy
histogram
函数和
matplotlib
hist
可以获得相同的行为。(我认为这是前者的包装?有点?)

我在做傻事吗?这是虫子吗?有没有更好的方法来创建表示近似数据的离散分布的数组

我在做傻事吗

嗯,是的,从某种意义上说,在有些事情令人困惑时不阅读文档是愚蠢的,但老实说,我通常也要晚很多才会阅读文档,所以我不适合扔石头。(^)

帮助(plt.hist)

基本上,正常化保证的是什么

>>> a = np.random.normal(0.4,0.1,1024)
>>> n, bins, patches = plt.hist(a, bins=32,range = ([0,1]),normed=True)
>>> (np.diff(bins) * n).sum()
1.0
我在做傻事吗

嗯,是的,从某种意义上说,在有些事情令人困惑时不阅读文档是愚蠢的,但老实说,我通常也要晚很多才会阅读文档,所以我不适合扔石头。(^)

帮助(plt.hist)

基本上,正常化保证的是什么

>>> a = np.random.normal(0.4,0.1,1024)
>>> n, bins, patches = plt.hist(a, bins=32,range = ([0,1]),normed=True)
>>> (np.diff(bins) * n).sum()
1.0
我在做傻事吗

嗯,是的,从某种意义上说,在有些事情令人困惑时不阅读文档是愚蠢的,但老实说,我通常也要晚很多才会阅读文档,所以我不适合扔石头。(^)

帮助(plt.hist)

基本上,正常化保证的是什么

>>> a = np.random.normal(0.4,0.1,1024)
>>> n, bins, patches = plt.hist(a, bins=32,range = ([0,1]),normed=True)
>>> (np.diff(bins) * n).sum()
1.0
我在做傻事吗

嗯,是的,从某种意义上说,在有些事情令人困惑时不阅读文档是愚蠢的,但老实说,我通常也要晚很多才会阅读文档,所以我不适合扔石头。(^)

帮助(plt.hist)

基本上,正常化保证的是什么

>>> a = np.random.normal(0.4,0.1,1024)
>>> n, bins, patches = plt.hist(a, bins=32,range = ([0,1]),normed=True)
>>> (np.diff(bins) * n).sum()
1.0

我意识到只要设置
normed=hist/float(sum(hist))
就很容易了,其中
hist
是未设置规范的柱状图(效果很好)。但令人费解的是,无论如何都不会发生这种情况。标准化的输出将在箱子的范围内积分到1的值。我意识到设置
normed=hist/float(sum(hist))
非常容易,其中
hist
是非标准化的直方图(工作正常)。但令人费解的是,无论如何都不会发生这种情况。标准化的输出将在箱子的范围内积分到1的值。我意识到设置
normed=hist/float(sum(hist))
非常容易,其中
hist
是非标准化的直方图(工作正常)。但令人费解的是,无论如何都不会发生这种情况。标准化的输出将在箱子的范围内积分到1的值。我意识到设置
normed=hist/float(sum(hist))
非常容易,其中
hist
是非标准化的直方图(工作正常)。但令人费解的是,无论如何情况并非如此。标准化的输出将在容器的范围内积分到1的值。