我想通过获取该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直方图一次只能填充一个数据点。
答案 0 :(得分:2)
考虑权重为x
的数组w
。由x
和w
加权的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)