2012-07-11 77 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給出垃圾箱密度,而不是垃圾箱中總項目的比例。您需要從料箱寬度或手動計算。