尴尬的数组 ak.unzip 行为

awkward array ak.unzip behaviour

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

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")

这个数组的键的排序与用于过滤 keys.If 的列表的排序不同,我现在使用 ak.unzip():

jet_data=ak.unzip(jet_data)

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

这其实是一个关于Uproot的问题。在这一行中:

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

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

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

或者,您可以在读取数组后通过使用字符串列表进行切片来重新排序字段。这样做不会影响性能——它只是重新排列元数据(完成时间不随数组的长度变化)。 This documentation 有一些示例(包括您在字段中选择字段的更复杂的情况,但简单的情况足以解决您的问题)。

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