2

我正在尝试使用优秀的uprootawkward-array读取存储在 TTree 中的一些分析数据。我知道 ROOT 不会std::vector<std::vector<int>>以柱状格式编写嵌套向量(即。),但是在讨论之后,我修改了我的树输出以包含两个单独std::vector<int>的分支:一个包含内容,一个std::vector<int>包含偏移量。内容向量在填充树之间多次将值推入其中。每次推入值时,内容向量的大小都会存储在偏移量中。

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

import awkward as ak
all_jagged_indices = ak.fromiter([[0, 1, 4], [0, 1, 2, 3]])
all_constituents = ak.fromiter([[12, 14, 3, 4], [2, 8, 3]])
output = ak.fromiter(
    (ak.JaggedArray.fromoffsets(jagged_indices, constituents)
     for jagged_indices, constituents in
     zip(all_jagged_indices, all_constituents))
)
expected = ak.fromiter([[[12], [14, 3, 4]], [[2], [8], [3]]])
assert (output == expected).all().all().all()

谢谢!

4

1 回答 1

1

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

不过,这是一个关键问题,也是将其中一些算法移植到 C++ 中的原因。本次演讲的最后一个情节直接解决了这种数据(锯齿状^ N 的数字),并将“for”循环移至 C++。这是为 Awkward 1.0 和 Uproot 4.0 开发的,计划在 4 月底为用户准备好。(此时,转换std::vector<std::vector<numbers>>将是自动的,因为不再有性能惩罚。)

然而,目前,隐含在 中的 Python“for”循环fromiter是您能做的最好的事情。

于 2020-02-16T18:38:00.210 回答