首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matplotlib histogram2d规格化不等于1

Matplotlib histogram2d规格化不等于1
EN

Stack Overflow用户
提问于 2012-07-12 00:18:52
回答 2查看 1.8K关注 0票数 1

有这样的一天,我不能理解发生了什么。我有一个工具,可以从X,Y,Z坐标的数组(Numpy数组)生成2D直方图(Z在一分钟内不重要)。我需要对结果进行归一化,这样我就可以做一些进一步的计算。但是,在使用normed=True命令时,数组的总和始终在0.000006左右。

我希望对整个直方图进行归一化,因此所有数组元素的总和为1。将normed设置为False会正确地返回bin中的样本数,但显然这不是归一化的。我已经用从3k元素一直到30k元素的数组进行了测试,但仍然存在相同的问题。为了记录,我的数据包括所有3个轴上的负坐标。

代码如下:

代码语言:javascript
复制
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语句:

代码语言:javascript
复制
0.000006250000000000000299510850
0.000006250000000000002840609692

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-12 01:23:18

normed=True将音量(即binarea*binheight之和)归一化为1,而不是高度之和。因为这是通常归一化直方图的方法,因为归一化直方图是概率密度函数的估计值。

如果想使高度之和为1,只需将未归一化值除以总点数:

代码语言:javascript
复制
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])
票数 4
EN

Stack Overflow用户

发布于 2012-07-12 01:14:01

设置normed=True会给出仓位密度,而不是仓位中所有项目的分数。您将需要根据bin宽度或手动计算此值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11437010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档