首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从.root文件中读取树,然后生成填充零的.h5文件

从.root文件中读取树,然后生成填充零的.h5文件
EN

Stack Overflow用户
提问于 2019-11-23 04:20:29
回答 1查看 86关注 0票数 1

我有一个文件,其中包含一个名为uproot.open("/data/debo/jetAnomaly/AtlasData/dijets/mergedRoot/miniTrees/user.cdelitzs.JZ2W.mini.root")"FlatSubstructureJetTreeD“= FlatSubstructureJetTreeD的树

它有以下分支

file.keys() 'fjet_pt','fjet_clus_P','fjet_clus_px','fjet_clus_py','fjet_clus_pz','EventInfo_mcEventWeight','fjet_xsec_filteff_numevents‘

fjet_clus_P、fjet_clus_px、fjet_clus_py、fjet_clus_pz是交错数组(不同事件中的不同条目)

我需要做一个零填充的数据集作为.h5文件的形式,这样每一行都有fjet_clus_P1,fjet_clus_px1,fjet_clus_py1,fjet_clus_pz1,fjet_clus_P2,fjet_clus_px2,fjet_clus_py2,fjet_clus_pz2,...,fjet_clus_Pn,fjet_clus_pxn,fjet_clus_pyn,fjet_clus_pzn格式的条目,你能建议在uproot中最聪明和最节省内存的方法吗?

谢谢,黛博。

EN

回答 1

Stack Overflow用户

发布于 2019-11-23 04:38:34

假设您已经将所有数组作为名为arrays的字典读出,

代码语言:javascript
复制
import uproot
file = uproot.open("/data/debo/jetAnomaly/AtlasData/dijets/mergedRoot/"
            "miniTrees/user.cdelitzs.JZ2W.mini.root"
           )["FlatSubstructureJetTreeD"]
arrays = file.arrays(["fjet_clus_P", "fjet_clus_px", "fjet_clus_py",
                      "fjet_clus_pz"], namedecode="utf-8")

您可以使用pad方法None-pad每个数组,然后使用fillnaNone值转换为零。在pad中,您必须指定一个长度;让我们取每个事件的最大长度。在此操作之后,JaggedArrays恰好在第二维具有相等的长度,因此使用regular将它们转换为NumPy数组。

代码语言:javascript
复制
for name in arrays:
    longest = arrays[name].counts.max()
    arrays[name] = arrays[name].pad(longest).fillna(0).regular()

现在它们是(二维) NumPy数组,h5py将识别它们,您可以按常规方式将它们写入HDF5文件。

编辑:,如果您想将所有数据放在一个连续的块数组中,则必须选择单个longest长度,预先分配块,然后填充它。(对regular的调用现在应该是可选的,但请检查。)

代码语言:javascript
复制
longest = 2
for name in arrays:
    arrays[name] = arrays[name].pad(longest).fillna(0)

output = numpy.empty(file.numentries,
                     dtype=[("px1", "f8"), ("py1", "f8"), ("pz1", "f8"),
                            ("px2", "f8"), ("py2", "f8"), ("pz2", "f8")])
output["px1"] = arrays["fjet_clus_px"][:, 0]
output["py1"] = arrays["fjet_clus_py"][:, 0]
output["py1"] = arrays["fjet_clus_pz"][:, 0]
output["px2"] = arrays["fjet_clus_px"][:, 1]
output["py2"] = arrays["fjet_clus_py"][:, 1]
output["py2"] = arrays["fjet_clus_pz"][:, 1]

这是矢量化的(即没有Python for循环,无论是隐式的还是显式的)。即使您在所有列名上编写一个循环,也只有10列左右,但可能有数百万或数十亿行。

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

https://stackoverflow.com/questions/59001209

复制
相关文章

相似问题

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