numpy 用根拔阅读树友

ryoqjall  于 2022-12-04  发布在  其他
关注(0)|答案(2)|浏览(274)

有没有一个等价于tTree::AddFriend()的根文件?我有两个平行的树在两个不同的文件中,我需要用根文件来读取。迭代和使用解释(设置根文件的'分支'选项)。
也许我可以通过手动从文件上的iterate()调用中获得几个迭代器,然后在每个迭代器上调用next()来实现这一点......但也许有一种更简单的方法,类似于AddFriend?
谢谢你的提示!

edit:我不确定我已经说清楚了,所以这里有一些细节。我的问题不是关于数组的用法,而是关于如何从不同的文件中读取数组。这里有一个我正在做的事情的模型:

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

那么,如果ab属于2个不同文件中的2棵树呢?

inb24sb2

inb24sb21#

在基于数组的编程中,friend是隐式的:您可以在事后对任意两列执行JOIN操作-不必事先将它们声明为朋友。
在最简单的情况下,如果你的数组ab有相同的长度和相同的顺序,你可以把它们一起使用,比如a + bab是否来自同一个文件并不重要。(如jets.phi),而另一个不是(如met.phi),您仍然可以,因为非交错数组将被广播以匹配交错数组。
请注意,awkward.Tableawkward.JaggedArray.zip可以将数组组合成单个Table或锯齿状Table,以便进行簿记。
如果两个数组的顺序不同,可能是因为每个writer都是单独并行化的,那么您需要某个列作为键,将一个数组的行与另一个数组的不同行关联起来。这是一个典型的数据库风格的JOIN,尽管Uproot和Awkward没有为它提供例程,但Pandas提供了。(在Pandas文档中查找“合并、联接和连接”--有很多!)您可以通过使用awkward.topandas函数准备列来维护Pandas中数组的锯齿状。
下面的问题讨论了很多这样的事情,尽管下面问题中的用户必须加入 * 文件集 *,而不仅仅是一个树。(原则上,一个进程必须提前查看所有文件,看看哪些文件包含哪些键:分布式数据库问题)。即使您的情况并非如此,您也可以在那里找到更多的提示,了解如何开始。
https://github.com/scikit-hep/uproot/issues/314

jgwigjjp

jgwigjjp2#

这就是我如何用uproot/awkward在不同的文件中“加为好友”(加为好友?)两个TTree。

import awkward
import uproot

iterate1 = uproot.iterate(["file_with_a.root"]) # has branch "a"
iterate2 = uproot.iterate(["file_with_b.root"]) # has branch "b"
for array1, array2 in zip(iterate1, iterate2):
    # join arrays
    for field in array2.fields:
        array1 = awkward.with_field(array1, getattr(array2, field), where=field)
    # array1 now has branch "a" and "b"
    print(array1.a)
    print(array1.b)

或者,如果“命名”树是可接受的,

import awkward
import uproot

iterate1 = uproot.iterate(["file_with_a.root"]) # has branch "a"
iterate2 = uproot.iterate(["file_with_b.root"]) # has branch "b"
for array1, array2 in zip(iterate1, iterate2):
    # join arrays
    zippedArray = awkward.zip({"tree1": array1, "tree2": array2})
    # zippedArray. now has branch "tree1.a" and "tree2.b"
    print(zippedArray.tree1.a)
    print(zippedArray.tree2.b)

当然,你可以把array1array2一起使用,而不用像这样把它们合并起来。但是如果你已经写了只需要1个Array的代码,这会很有用。

相关问题