2012-07-11 78 views
0

有一天,我无法理解发生了什么。我有一个工具可以根据X,Y,Z坐标(Z在当时不重要)的数组(Numpy数组)生成2D直方图。我需要将结果归一化,以便进一步计算。但是,使用normed = True命令时,数组的总和总是在0.000006左右。Matplotlib histogram2d正常化不等于1

我正在寻找归一化整个直方图,所以所有的数组元素将加起来为1.设置为False正确返回bin中的样本数,但显然这是不规范化的。我已经用从3k元素到30k元的数组进行了测试,仍然是同样的问题。为了记录我的数据包括所有3个轴上的负坐标。

代码如下:

def histogrammer(coords):  # coords is a 3D numpy array 

H, xedges, yedges = np.histogram2d(coords[:,0], coords[:,1], bins=(50, 50), range=([-10000.0,10000.0],[-10000.0,10000.0]), normed=True) 
H.shape, xedges.shape, yedges.shape 
extent = [yedges[0], yedges[-1], xedges[-1], xedges[0]] 

global displayHistograms 
if displayHistograms == True: 
    print('Displaying:') 
    plt.imshow(H, extent=extent, interpolation='nearest') 
    plt.colorbar() 
    plt.show() 

print('{0:.30f}'.format(np.sum(H))) # Debug normalisation 

return H 

我运行两个数组此代码,生成两个不同的直方图。每个打印语句:

0.000006250000000000000299510850 
0.000006250000000000002840609692 

任何人都可以告诉我哪里出错了吗?预先感谢任何帮助!

回答

4

normed=True将音量(即总和binarea*binheight)归一化为1,而不是高度的总和。因为这是通常对直方图进行归一化的方式,因为归一化直方图是对概率密度函数的估计。

如果你想使一个高度的总和,仅仅靠点的总数除以非标准化值:

H, xedges, yedges = np.histogram2d(coords[:,0], coords[:,1], bins=(50, 50), range=([-10000.0,10000.0],[-10000.0,10000.0])) 
H_normalized = H/float(coords.shape[0]) 
+0

对,我现在明白了!有趣的是,现在我在上面列出的标准化之后得到了'0.999999999999998778754672912328'。我已经检查过,'H'中的总项目与'coords'数组中的相同。 – Tomassino 2012-07-11 19:25:20

+0

忽略上述注释,我将打印语句的精度更改为.2f,数字四舍五入为1.0。 – Tomassino 2012-07-11 21:37:56

0

设置normed = True给出垃圾箱密度,而不是垃圾箱中总项目的比例。您需要从料箱宽度或手动计算。