这实际上是一个关于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
返回的内容)。名称是可选的——没有字段名称,记录变成元组。