1

有一个这样的日子,我无法理解正在发生的事情。我有一个工具,可以从 X、Y、Z 坐标的数组(Numpy 数组)生成 2D 直方图(此时 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

谁能告诉我哪里出错了?提前感谢您的帮助!

4

2 回答 2

4

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

如果要使高度总和为 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])
于 2012-07-11T17:23:17.740 回答
0

设置 normed=True 给出 bin 密度,而不是 bin 中总项目的分数。您需要根据 bin 宽度或手动计算。

于 2012-07-11T17:14:00.533 回答