Python 将数组JaggedArray内容和偏移合并到嵌套的JaggedArray中

Python 将数组JaggedArray内容和偏移合并到嵌套的JaggedArray中,python,physics,uproot,awkward-array,Python,Physics,Uproot,Awkward Array,我正在尝试使用出色的根除和笨拙数组来读取存储在TTree中的一些分析数据。我知道ROOT不会以列格式编写嵌套向量(即,std::vector),但接下来,我修改了我的树输出,以包含两个独立的分支:一个带有内容的std::vector,另一个带有偏移量的std::vector。内容向量的值在填充树之间被多次推入。每次推入值时,内容向量的大小都存储在偏移量中 我的想法是,当我阅读树时,我将通过嵌套的JaggedArray重新创建我需要的结构。然而,通读这些笨拙的数组文档,我似乎无法找到正确的方法来构

我正在尝试使用出色的
根除
笨拙数组
来读取存储在TTree中的一些分析数据。我知道ROOT不会以列格式编写嵌套向量(即,
std::vector
),但接下来,我修改了我的树输出,以包含两个独立的分支:一个带有内容的
std::vector
,另一个带有偏移量的
std::vector
。内容向量的值在填充树之间被多次推入。每次推入值时,内容向量的大小都存储在偏移量中

我的想法是,当我阅读树时,我将通过嵌套的
JaggedArray
重新创建我需要的结构。然而,通读这些笨拙的数组文档,我似乎无法找到正确的方法来构造这个嵌套的
JaggedArray
,而不在python中循环
fromoffsets
需要1D索引,这意味着锯齿状索引必须展平,然后失去其结构。其他
classmethod
s似乎都不适合。下面的示例使用了一个生成器,我认为由于python中的循环,该生成器将非常慢。有没有更好的方法来构造JaggedArray?还是在树中存储数据的更好方法

导入为ak
所有锯齿状指数=ak.fromiter([[0,1,4],[0,1,2,3])
所有成分=ak.fromiter([12,14,3,4],[2,8,3])
输出=ak.fromiter(
(ak.JaggedArray.fromOffset(锯齿指数,成分)
对于锯齿_指数,在
zip(所有锯齿状指数、所有成分))
)
预期值=ak.fromiter([[12]、[14,3,4]、[[2]、[8]、[3]])
断言(输出==预期).all().all().all().all()

谢谢

您的想法是正确的,但是最终,没有一种方法可以将锯齿状
ObjectArray
转换为没有“for”循环的双锯齿状数组。数据的结构需要它

<>这是一个关键问题,这也是为什么这些算法中的一些被移植到C++中的原因。最后一个图直接用一个“OF”循环移动到C++中,来处理这种数据(数字的锯齿)。这是为笨拙的1.0和根除4.0开发的,计划在四月底为用户准备好。(此时,
std::vector
的转换将自动进行,因为不再存在性能惩罚。)


不过,目前,最好是在fromiter的
中隐式地使用Python“for”循环。

谢谢Jim!我期待着《连根拔起4》准备好后的到来!当它到达时,您是否期望组合两个锯齿状分支与直接存储
std::vector
之间会有性能差异?前者肯定更容易出错,所以如果没有区别(听起来好像现在没有区别),那么我就用后者。根除3没有给你一个双锯齿数组的原因是因为它的性能差异如此之大,我认为有必要将其设置为可选。性能差异消失后,根除4将直接返回双锯齿阵列。不会有任何要构建的内容。@JimPivarski最近实现了返回双锯齿数组的功能吗?用于转换
ObjectArray
fromiter
方法对于探索性使用来说非常缓慢。它已经在Awkward1中实现:但Awkward1仍然需要集成到Outrot中。(事实上,这就是我现在正在研究的内容。)目前,您必须手动将数组从“根除”移动到“笨拙1”。请注意,我认为有一种方法可以以最佳方式处理ObjectArray和非ObjectArray。