将笨拙的数组 JaggedArray 内容和偏移量组合到嵌套的 JaggedArray 中
Combine awkward-array JaggedArray contents and offsets into nested JaggedArray
我正在尝试使用优秀的 uproot
和 awkward-array
来读取存储在 TTree 中的一些分析数据。我知道 ROOT 不会以柱状格式编写嵌套向量(即 std::vector<std::vector<int>>
),但在 this discussion 之后,我修改了我的树输出以包含两个单独的分支:一个 std::vector<int>
与内容,以及一个 std::vector<int>
与偏移量。内容向量在填充树之间多次将值推入其中。每次它有值被推入时,内容向量的大小被存储在偏移量中。
我的想法是,当我阅读树时,我将通过嵌套 JaggedArray
重新创建我需要的结构。然而,通读笨拙的数组文档,我似乎无法找出正确的方法来构造这个嵌套的 JaggedArray
而不是在 python 中循环。 fromoffsets
需要一个一维索引,这意味着锯齿状索引必须展平,然后失去它们的结构。其他 classmethod
中的 None 似乎适合。下面的示例使用了一个生成器,我认为由于在 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()
谢谢!
您的想法是正确的,但最终,没有一种方法可以在不使用 "for" 循环的情况下将锯齿状 ObjectArray
转换为双重锯齿状数组。数据的结构需要它。
不过,这是一个关键问题,这也是将其中一些算法移植到 C++ 中的原因。最后一个图 in this talk 通过移入 C++ 的 "for" 循环直接处理此类数据(数字的锯齿状 ^N)。这是针对 Awkward 1.0 和 Uproot 4.0 的开发,计划于 4 月底为用户准备好。 (此时,std::vector<std::vector<numbers>>
的转换将是自动的,因为不再有性能损失。)
但是,目前,Python "for" 循环(隐含在 fromiter
中)是您所能做的最好的。
我正在尝试使用优秀的 uproot
和 awkward-array
来读取存储在 TTree 中的一些分析数据。我知道 ROOT 不会以柱状格式编写嵌套向量(即 std::vector<std::vector<int>>
),但在 this discussion 之后,我修改了我的树输出以包含两个单独的分支:一个 std::vector<int>
与内容,以及一个 std::vector<int>
与偏移量。内容向量在填充树之间多次将值推入其中。每次它有值被推入时,内容向量的大小被存储在偏移量中。
我的想法是,当我阅读树时,我将通过嵌套 JaggedArray
重新创建我需要的结构。然而,通读笨拙的数组文档,我似乎无法找出正确的方法来构造这个嵌套的 JaggedArray
而不是在 python 中循环。 fromoffsets
需要一个一维索引,这意味着锯齿状索引必须展平,然后失去它们的结构。其他 classmethod
中的 None 似乎适合。下面的示例使用了一个生成器,我认为由于在 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()
谢谢!
您的想法是正确的,但最终,没有一种方法可以在不使用 "for" 循环的情况下将锯齿状 ObjectArray
转换为双重锯齿状数组。数据的结构需要它。
不过,这是一个关键问题,这也是将其中一些算法移植到 C++ 中的原因。最后一个图 in this talk 通过移入 C++ 的 "for" 循环直接处理此类数据(数字的锯齿状 ^N)。这是针对 Awkward 1.0 和 Uproot 4.0 的开发,计划于 4 月底为用户准备好。 (此时,std::vector<std::vector<numbers>>
的转换将是自动的,因为不再有性能损失。)
但是,目前,Python "for" 循环(隐含在 fromiter
中)是您所能做的最好的。