当我访问一个根文件并提取我想要的数据时,请参见下面的示例:
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)分拣是否可靠和可再生产?如果我打开不同的根目录文件,我能实现同样的“排序”吗?
发布于 2021-01-08 06:12:06
这其实是一个关于连根拔起的问题。在这一行:
>>> jet_data=events.arrays(filter_name=["Jet_nFirstTrack","Jet_nLastTrack","Jet_pt","Jet_phi","Jet_eta"],library="ak")filter_name只是一个过滤器,接受或拒绝根文件中的分支。这些分支在文件中有一个自然的顺序,并且输出可能是这个顺序(因此在重复尝试时是稳定的,除非在某个点涉及一个dict,并且您正在使用PythonPython3.5)。
如果要强制执行订单,请将分支名称列表传递为expressions,而不是filter_name。这个论点有不同的含义:expressions可以是简单的公式;filter_name可以有通配符-因此,像*这样的字符在每一个字符中都有非常不同的含义!
或者,您可以在读取数组后重新排序,方法是使用字符串列表进行切片。这样做没有任何性能损失--它只是重新排列元数据(完成的时间不随数组的长度而缩放)。这份文件有一些示例(包括在字段中选择字段的更复杂的情况,但简单的情况足以解决您的问题)。
编辑:,我应该补充一下,尴尬数组中的记录字段有一个可重复的顺序。它们不是不稳定的hashmap,比如PythonJava3.5中的<=。它们实际上是两个相同长度的列表:有序字段(这是ak.unzip返回的内容)和有序字段名称( ak.fields返回的字段)。名称是可选的-如果没有字段名,记录就会变成元组。
https://stackoverflow.com/questions/65623014
复制相似问题