我正在尝试使用出色的uproot
和awkward-array
来读取存储在TTree中的一些分析数据。我知道ROOT不会以列格式写入嵌套向量(即std::vector<std::vector<int>>
),但是在this discussion之后,我将树输出修改为包含两个单独的分支:一个带有内容的std::vector<int>
,另一个是[ C0]和偏移量。内容向量在填充树之间多次被推入其中。每次输入值时,内容向量的大小就会存储在偏移量中。
我的想法是,当我阅读树时,我将通过嵌套的std::vector<int>
重新创建所需的结构。但是,在阅读尴尬的数组文档时,我似乎无法找出在不循环使用python的情况下构造此嵌套JaggedArray
的正确方法。 JaggedArray
需要一维索引,这意味着锯齿状的索引必须变平,然后失去其结构。其他fromoffsets
似乎都不适合。下面的示例使用了一个生成器,由于python中的循环,我认为它会相当慢。有没有更好的方法来构造classmethod
?还是将数据存储在树中的更好方法?
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()
转换为没有“ for”循环的双锯齿状数组。数据的结构需要它。