python中加权直方图的错误

时间:2018-01-12 13:13:35

标签: python numpy matplotlib histogram weighted

我想通过获取该bin中权重之和(sumw2)的平方根(poission error)来计算bin高度的误差。当使用matplotlib或numpy(或任何其他库)对数据进行直方图编码时,有没有办法得到权重(sumw)和/或sumw2的总和?

假设我在numpy数组x中有一些数据,在另一个numpy数组中有一些权重w,以获得直方图,我会这样做

n, bins, patches = pyplot.hist(x,weights=w)

n, bins = numpy.histogram(x,weights=w)

在这两种情况下,我都不知道w的哪些条目属于哪个bin对吧?

编辑:目前我正在使用YODA来执行此操作。从我的观点来看,缺点是YODA直方图一次只能填充一个数据点。

2 个答案:

答案 0 :(得分:2)

考虑权重为x的数组w。由xw加权的bins中数据的直方图如下:

n, bins = np.histogram(x, bins=bins, weights=w)

与n相关的误差可以计算为:

n_err = np.sqrt(np.histogram(x, bins=bins, weights=w**2)[0])

请注意,如果未对数据进行加权(即(w == 1).all()),则错误会减少到“标准” np.sqrt(n)

答案 1 :(得分:1)

根据numpy documentation,权重

  

一系列重量,形状与a相同。每个值只有一个   将相关的权重贡献给仓数(而不是   1)。如果密度为True,则权重被归一化,因此   密度超出范围的积分仍为1。

这意味着w中的每个值都应与x中的值相关联。如果你想加权箱并绘制它们,你可以先找到箱子的值,然后乘以权重,最后用bar绘制它们。

val, pos = np.histogram(np.arange(1000))
w_val = val * w
plt.bar(pos[1:], w_val)

<小时/> 评论更新:

啊,对不起,我似乎不明白最初的问题。实际上,您可以使用pos查找与每个bin相关的单元格,并使用这些信息计算您的权重函数。

for left, right in zip(pos, pos[1:): 
    ix = np.where((x >= left) & (x <= right))[0] 
    sumw2 = np.sum(w[ix] ** 2)