有这样的一天,我不能理解发生了什么。我有一个工具,可以从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我对两个数组运行此代码,生成两个不同的直方图。每条语句的print语句:
0.000006250000000000000299510850
0.000006250000000000002840609692有没有人能告诉我哪里出错了?提前感谢您的帮助!
发布于 2012-07-12 01:23:18
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-12 01:14:01
设置normed=True会给出仓位密度,而不是仓位中所有项目的分数。您将需要根据bin宽度或手动计算此值。
https://stackoverflow.com/questions/11437010
复制相似问题