python - Matplotlib histogram2d 归一化不等于 1

标签 python python-3.x matplotlib

有那么一天,我无法理解正在发生的事情。我有一个工具可以从 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/

相关文章:

python - 我应该使用属性还是 getter 和 setter?

python - 在 Python 应用程序 (Windows) 中创建小型转储

Python 日志记录 SMTPHandler 不工作

python - 在 matplotlib 中创建插图

python - 如何将行标题添加到以下 matplotlib 代码中?

python - unicodedata.normalize 在 python 中做什么?

python - 在自适应阈值中给出 block 大小值的基础是什么?

python-3.x - 在 pandas 数据框中插入一行而不更改为 Python 中的列表

python - 根据累积值将非累积计算到新列中 (Python)

Matplotlib 较暗的 HSV 颜色图