Я пытаюсь использовать отличные uproot
и awkward-array
, чтобы прочитать некоторые данные анализа, хранящиеся в TTree. Я понимаю, что ROOT не записывает вложенные векторы (ie. std::vector<std::vector<int>>
) в столбчатом формате, но после этого обсуждения я изменил вывод своего дерева так, чтобы он содержал две отдельные ветви: одну std::vector<int>
с контентом и один std::vector<int>
со смещениями. Вектор содержимого имеет значения, вставленные в него несколько раз между заполнением дерева. Каждый раз, когда в него вставляются значения, размер вектора содержимого сохраняется в смещениях.
Моя идея заключалась в том, что я буду воссоздавать нужную мне структуру через вложенный JaggedArray
, когда я читаю дерево. Однако, читая документацию по неловкому массиву, я не могу найти правильный способ создания этого вложенного JaggedArray
без зацикливания на python. fromoffsets
требует 1D индекса, что означает, что зазубренные индексы должны быть сглажены, что затем теряет их структуру. Ни один из других 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()
Спасибо!