1

当我访问根文件并提取我想要的数据时,如下例所示:

events=uproot.open(filename)["btagana/ttree;6"]    
jet_data=events.arrays(filter_name=["Jet_nFirstTrack","Jet_nLastTrack","Jet_pt","Jet_phi","Jet_eta"],library="ak")

该数组的键的排序与用于过滤键的列表的排序不同。如果我现在使用 ak.unzip():

jet_data=ak.unzip(jet_data)

分拣是否可靠且可重复?如果我打开不同的根文件,我是否能够实现相同的“排序”

4

1 回答 1

1

这实际上是一个关于Uproot的问题。在这一行:

>>> jet_data=events.arrays(filter_name=["Jet_nFirstTrack","Jet_nLastTrack","Jet_pt","Jet_phi","Jet_eta"],library="ak")

filter_name只是一个过滤器,接受或拒绝来自 ROOT 文件的分支。这些分支在文件中具有自然顺序,并且输出可能是该顺序(因此在反复尝试时稳定,除非在某些时候涉及字典并且您使用的是 Python <= 3.5)。

如果您想强制执行命令,请将您的分支名称列表传递为expressions,而不是filter_name。这个论点有不同的含义:expressions可以是简单的公式;filter_name可以有通配符——因此,像这样的字符*在每个中都有非常不同的含义!

或者,您可以在读取数组后通过对字符串列表进行切片来重新排序字段。这样做没有性能损失——它只是重新排列元数据(完成时间不随数组的长度而缩放)。本文档有一些示例(包括您在字段中选择字段的更复杂的情况,但简单的情况足以解决您的问题)。

编辑:我应该添加 Awkward Arrays 中的记录字段具有可重现的顺序。它们不像 Python <= 3.5 中的 dicts 那样不稳定的哈希图。它们实际上是两个长度相等的列表:有序字段(ak.unzip返回的内容)和有序字段名称(ak.fields返回的内容)。名称是可选的——没有字段名称,记录变成元组。

于 2021-01-08T06:12:06.097 回答