1

是否有与 uproot 等效的TTree::AddFriend () ?我在 2 个不同的文件中有 2 个并行树,我需要使用 uproot.iterate 和使用解释(设置 uproot.iterate 的“分支”选项)读取它们。

也许我可以通过从文件上的 iterate() 调用手动获取几个迭代器,然后在每个迭代器上调用 next() 来做到这一点......但也许有一种类似于 AddFriend 的更简单的方法?

感谢您的任何提示!

编辑:我不确定我是否清楚,所以这里有更多细节。我的问题不是关于数组的使用,而是关于如何从不同的文件中读取它们。这是我正在做的一个模型:

# I will fill this array and give it as input to my DNN
# it's very big so I will fill it in place

bigarray = ndarray( (2,numentries),...)

# get a handle on a tree, just to be able to build interpretations :
t0 = .. first tree in input_files
interpretations = dict(
    a=t0['a'].interpretation.toarray(bigarray[0]),
    b=t0['b'].interpretation.toarray(bigarray[1]),
    )
# iterate with :
uproot.iterate( input_files, treename,
                branches = interpretations )    

那么如果a并且b属于 2 个不同文件中的 2 棵树呢?

4

1 回答 1

1

在基于数组的编程中,友元是隐含的:您可以JOIN 在事后任意两列——您不必提前将它们声明为友元。

在最简单的情况下,如果您的数组ab具有相同的长度和相同的顺序,您可以将它们一起使用,例如a + b. a和是否b来自同一个文件并不重要。即使我有这些是锯齿状的(如jets.phi)而另一个不是(如met.phi),你仍然可以,因为非锯齿状数组将被广播以匹配锯齿状数组。

请注意,awkward.Tableandawkward.JaggedArray.zip可以将数组组合成单个Table或锯齿状Table以进行簿记。

如果两个数组的顺序不同,可能是因为每个编写器都单独并行化,那么您将需要一些列作为将一个数组的行与另一个数组的不同行相关联的键。这是一种经典的数据库风格JOIN,虽然 Uproot 和 Awkward 没有为它提供例程,但 Pandas 提供了。(在 Pandas 文档中查找“合并、连接和连接”——有很多内容!)您可以通过使用awkward.topandas函数准备列来保持数组在 Pandas 中的锯齿状。

下期讨论了很多这些事情,尽管下期中的用户必须加入文件集,而不仅仅是一棵树。(原则上,一个进程必须先查看所有文件以查看哪些文件包含哪些键:分布式数据库问题。)即使您的情况不是这样,您也可能会在那里找到更多提示以了解如何开始。

https://github.com/scikit-hep/uproot/issues/314

于 2020-02-25T12:07:59.623 回答