0

所以,这就是交易。我有一大堆介于 0 和 1 之间的浮点数。我想要一个一维浮点数数组,用于计算特定箱中的实例数。在单位间隔上均匀分布有 32 个 bin。

我认为规范直方图会做我想做的事,但我得到了一些令人费解的行为。基本上,归一化直方图应该返回我想要的(我会想到的),但它会抛出 [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.     ]))

事实上,这种行为不仅仅是小浮动。如果您使正态分布以 7.4 为中心并将范围向上移动到 [7,8],您会得到同样令人费解的行为。

你会得到与numpy'histogram函数和matplotlib'相同的行为hist。(我认为这是前者的包装?有点?)

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

4

1 回答 1

3

我在做傻事吗?

嗯,是的,从某种意义上说,当某些事情令人困惑时不阅读文档是愚蠢的,但老实说,我通常不会阅读文档,直到我应该也很晚,所以我不是一个很好的位置扔石头。:^)

来自help(plt.hist)

normed : boolean, optional, default: False
    If `True`, the first element of the return tuple will
    be the counts normalized to form a probability density, i.e.,
    ``n/(len(x)`dbin)``, ie the integral of the histogram will sum to
    1. If *stacked* is also *True*, the sum of the histograms is
    normalized to 1.

基本上,规范化保证的是

>>> 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
于 2013-10-08T16:13:03.003 回答