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