Объединить содержимое JaggedArray и неудобные массивы во вложенный JaggedArray - PullRequest
2 голосов
/ 16 февраля 2020

Я пытаюсь использовать отличные 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()

Спасибо!

1 Ответ

1 голос
/ 16 февраля 2020

У вас есть правильная идея, но, в конечном счете, нет способа преобразовать зубчатый ObjectArray в дважды зубчатый массив без "for" l oop. Структура данных требует этого.

Это ключевой вопрос, и поэтому некоторые из этих алгоритмов переносятся в C ++. Последний график в этом выступлении напрямую обращается к данным такого типа (с зубчатыми ^ N цифрами) с "для" l oop, перемещенным в C ++. Он находится в разработке для Awkward 1.0 и Up root 4.0, которые должны быть готовы для пользователей в конце апреля. (В этот момент преобразование std::vector<std::vector<numbers>> будет автоматическим c, потому что больше нет пенальности производительности.)

В настоящий момент, однако, Python "для" l oop, неявно в пределах fromiter, это лучшее, что вы можете сделать.

...