我有一个文件,其中包含一个名为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中最聪明和最节省内存的方法吗?
谢谢,黛博。
发布于 2019-11-23 04:38:34
假设您已经将所有数组作为名为arrays的字典读出,
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每个数组,然后使用fillna将None值转换为零。在pad中,您必须指定一个长度;让我们取每个事件的最大长度。在此操作之后,JaggedArrays恰好在第二维具有相等的长度,因此使用regular将它们转换为NumPy数组。
for name in arrays:
longest = arrays[name].counts.max()
arrays[name] = arrays[name].pad(longest).fillna(0).regular()现在它们是(二维) NumPy数组,h5py将识别它们,您可以按常规方式将它们写入HDF5文件。
编辑:,如果您想将所有数据放在一个连续的块数组中,则必须选择单个longest长度,预先分配块,然后填充它。(对regular的调用现在应该是可选的,但请检查。)
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列左右,但可能有数百万或数十亿行。
https://stackoverflow.com/questions/59001209
复制相似问题