我正在尝试使用优秀的uproot和awkward-array来读取存储在TTree中的一些分析数据。我知道ROOT不会编写嵌套向量(即。std::vector<std::vector<int>>),但在this discussion之后,我修改了树输出,使其包含两个单独的分支:一个包含内容的std::vector<int>,另一个包含偏移量的std::vector<int>。在填充树之间,内容向量中的值被多次推入其中。每次将值推入时,内容向量的大小都存储在偏移量中。
我的想法是在读取树时通过嵌套的JaggedArray重新创建所需的结构。然而,通过阅读笨拙的数组文档,我似乎找不出正确的方法来构造这个嵌套的JaggedArray,而不是在python中进行循环。fromoffsets需要一维索引,这意味着参差不齐的索引必须被展平,这样就失去了它们的结构。其他的classmethod似乎都不合适。下面的例子使用了一个生成器,我认为由于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()谢谢!
发布于 2020-02-17 02:38:00
您的想法是正确的,但最终没有办法在没有"for“循环的情况下将参差不齐的ObjectArray转换为双重参差不齐的数组。数据的结构需要它。
然而,这是一个关键问题,也是其中一些算法被移植到C++中的原因。最后一个绘图in this talk通过移到C++中的"for“循环直接寻址这类数据(数字的锯齿^N)。这是为笨拙的1.0和Uproot 4.0开发的,计划在4月底为用户准备好。(在这一点上,std::vector<std::vector<numbers>>的转换将是自动的,因为不再有性能惩罚。)
然而,目前,在fromiter中隐式使用Python "for“循环是最好的选择。
https://stackoverflow.com/questions/60250877
复制相似问题