如何在scikit-hep hist中将线性分箱的hist对象转为log(x)分箱?
关于scikit-hep hist线性分箱转log(x)分箱的实现方案
scikit-hep hist完全支持自定义箱边重分箱,针对log(x)分箱的需求,有两种高效的实现方式,无需手动循环切片:
方法1:直接创建对数分箱的新直方图
如果只需要标准的对数均匀分箱,可以利用LogN参数快速生成新直方图,并迁移原数据的计数和误差:
import hist import numpy as np # 示例原线性分箱直方图 h = hist.Hist.new.Reg(100, 1, 1000, name="x").Double() h.fill(np.random.uniform(1, 1000, 10000)) # 创建50个箱的对数分箱直方图,范围与原直方图一致 h_log = hist.Hist.new.LogN(50, h.axes[0].low, h.axes[0].high, name="x").Double() # 填充原直方图的中心值、计数和误差 h_log.fill(h.axes[0].centers, weight=h.values(), variance=h.variances())
方法2:自定义箱边实现重分箱
如果需要非标准的对数分箱(比如自定义间隔),可以构造箱边数组,通过uhi索引语法直接重分箱:
# 构造自定义对数分箱边(示例:从1到1000,共50个箱) new_edges = np.logspace(np.log10(1), np.log10(1000), 50) # 直接通过索引完成重分箱,自动合并原箱计数 h_custom_log = h[{0: new_edges}]
上述两种方式都能替代手动循环切片的方案,其中第二种方式是uhi索引语法的扩展用法,比你提到的均匀重分箱h[::rebin(2)]更灵活,完全适配自定义分箱场景。
内容的提问来源于stack exchange,提问作者browniedragon
相关产品推荐
相关产品推荐

