有那么一天,我无法理解正在发生的事情。我有一个工具可以从 X、Y、Z 坐标的数组(Numpy 数组)生成二维直方图(此时 Z 并不重要)。我需要对结果进行归一化,以便我可以做一些进一步的计算。然而,当使用 normed=True 命令时,数组的总和总是在 0.000006 左右。
我希望对整个直方图进行归一化,因此所有数组元素加起来为 1。将 normed 设置为 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
谁能告诉我哪里出错了?在此先感谢您的帮助!
最佳答案
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])
关于python - Matplotlib histogram2d 归一化不等于 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11437010/