Получить все атрибуты с общим именем на разных уровнях в неудобном массиве

#python #python-3.x #awkward-array

#python #python-3.x #неудобный-массив

Вопрос:

Предоставляет ли библиотека awkward способ вырезать все атрибуты с заданным именем, независимо от уровня? Я думал о чем-то вроде этого:

 import awkward as ak

obj = {
    'resource_id': 'abc',
    'events': [
        {'resource_id': '123', 'value': 12, 'picks':
            [{'resource_id': 'asd', 'value': 1},
             {'resource_id': 'dll', 'value': 12}
            ]
         },
         {'resource_id': '456', 'value': 12, 'picks':
            [{'resource_id': 'cvf', 'value': 23},
             {'resource_id': 'ggf', 'value': 34},
             ]
         },
    ]
}


ar = ak.from_iter(obj)

rid = ar[..., 'resource_id']
 

Значение rid — это просто строка ‘abc’, но я ожидал чего-то более похожего на следующее:

 [
   ['abc'],
   ['events':[
       [['123'], 'picks':[['asd'], ['dll']]], 
       [['456'], 'picks':[['cvf'], ['ggf']]],
   ]
]       
 

Тем не менее, я все еще пытаюсь разобраться в неудобных массивах, чтобы я мог полностью отключиться здесь.

Ответ №1:

Это не так, и я не уверен, как должен быть сформирован результат такой операции. Например, если вы выберете внешний "resource_id" , вы получите

 >>> ar["events", "resource_id"]
<Array ['123', '456'] type='2 * string'>
 

но если вы выберете внутренний "resource_id" , вы получите

 >>> ar["events", "picks", "resource_id"]
<Array [['asd', 'dll'], ['cvf', 'ggf']] type='2 * var * string'>
 

Обратите внимание, что значение ... имеет значение, но оно разрезает строки (вложенные списки), а не столбцы (имена полей записи).

 >>> ar["events", "picks", "value"]
<Array [[1, 12], [23, 34]] type='2 * var * int64'>
>>> ar["events", "picks", "value", ..., 0]
<Array [1, 23] type='2 * int64'>
 

Кроме того, это может помочь узнать, что вы можете проецировать строки и списки строк (вложенная проекция):

 >>> print(ar["events", "picks", ["resource_id", "value"]])
[[{resource_id: 'asd', value: 1}, ... {resource_id: 'ggf', value: 34}]]
 

в случае, если это поможет с вашей проблемой нарезки (которая, вероятно, будет вручную выбираться "resource_id" на всех уровнях и объединять их таким образом, чтобы это имело смысл для ваших данных, но, возможно, не может быть обобщено).