如何解决尴尬的数组 ak.unzip 行为
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)
排序是否可靠且可重复?如果我打开不同的根文件,我是否能够实现相同的“排序”
解决方法
这其实是一个关于Uproot的问题。在这一行:
>>> jet_data=events.arrays(filter_name=["Jet_nFirstTrack","Jet_nLastTrack","Jet_pt","Jet_phi","Jet_eta"],library="ak")
filter_name
只是一个过滤器,接受或拒绝来自 ROOT 文件的分支。这些分支在文件中具有自然顺序,并且输出可能就是该顺序(因此在重复尝试时是稳定的,除非在某些时候涉及 dict 并且您使用的是 Python
如果您想强制执行某个命令,请将您的分支名称列表作为 expressions
而不是 filter_name
传递。该参数有不同的含义:expressions
可以是简单的公式; filter_name
可以有通配符——因此,像 *
这样的字符在每个字符中都有非常不同的含义!
或者,您可以在读取数组后通过对字符串列表进行切片来重新排序字段。这样做没有性能损失——它只是重新排列元数据(完成时间不随数组的长度而缩放)。 This documentation 有一些示例(包括您在字段中选择字段的更复杂的情况,但简单的情况足以解决您的问题)。
编辑:我应该补充一点,Awkward Arrays 中的记录字段具有可重现的顺序。它们不是像 Python ak.unzip 返回的内容)和有序字段名称(ak.fields
返回的内容)。名称是可选的——没有字段名称,记录变成元组。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。