1

我有一个 .root 文件,其中包含一个名为 FlatSubstructureJetTreeD file = uproot.open("/data/debo/jetAnomaly/AtlasData/dijets/mergedRoot/miniTrees/user.cdelitzs.JZ2W.mini.root")["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],您能否建议在根除时最聪明且内存效率最高的方法是什么?

谢谢,德波。

4

1 回答 1

0

假设您已将所有数组作为名为 的 dict 读取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")

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

for name in arrays:
    longest = arrays[name].counts.max()
    arrays[name] = arrays[name].pad(longest).fillna(0).regular()

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

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

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 列左右,但可能有数百万或数十亿行。

于 2019-11-22T20:38:34.473 回答