Существует множество рецептов для выравнивания вложенного списка. Я скопировать решение здесь только для справки:Сглаживание и развязка вложенного списка массивов numpy
def flatten(x):
result = []
for el in x:
if hasattr(el, "__iter__") and not isinstance(el, basestring):
result.extend(flatten(el))
else:
result.append(el)
return result
То, что я заинтересован в это обратная операция, которая перестраивает список в оригинальном формате. Например:
L = [[array([[ 24, -134],[ -67, -207]])],
[array([[ 204, -45],[ 99, -118]])],
[array([[ 43, -154],[-122, 168]]), array([[ 33, -110],[ 147, -26],[ -49, -122]])]]
# flattened version
L_flat = [24, -134, -67, -207, 204, -45, 99, -118, 43, -154, -122, 168, 33, -110, 147, -26, -49, -122]
Есть ли эффективный способ сглаживания, сохранения индексов и восстановления до его первоначального формата?
Обратите внимание, что список может быть произвольной глубины и может не иметь правильной формы и содержать массивы различных размеров.
Конечно, функция сглаживания также должна быть изменена для сохранения структуры списка и формы массивов numpy
.
Как вы должны знать, из сплющенной версии, изначально это было? Вы потеряли информацию в процессе сглаживания. – jonrsharpe
Конечно, функция сглаживания должна быть изменена для сохранения структуры списка. – memecs
В какой-то степени вы ответили на свой вопрос; вам нужно изменить 'flatten', чтобы сохранить информацию о структуре списка и формах массивов внутри него. Например, он мог бы возвращать '[[(2, 2)], [(2, 2)], [(2, 2), (3, 2)]]' рядом с сплющенным 'L'. Затем вам придется нарезать 'L_flat' соответственно и« переформатировать »массивы из каждого фрагмента. – jonrsharpe