Сглаживание списков списков является хорошо известной проблемой, но как сгладить список списков списков наиболее пифонов? Моя конечная цель - создать массив numpy следующим образом:
[In]: mylist = [[[1,2,3], [4]], [[5,6], [7,8]]]
[Out]: array([[1, 2, 3, 4],
[5, 6, 7, 8]])
но даже просто полностью сглаживается в длинный список (в любом случае его можно легко преобразовать в правую форму). Типичный выходной массив будет иметь размеры (10000, 10), поэтому циклическое перемещение по строкам будет очень неэффективным. Все идеи будут оценены!
(edit) Лучшее решение, о котором я могу думать:
import itertools
for i in range(len(mylist)):
mylist[i] = list(itertools.chain.from_iterable(mylist[i]))
np.array(mylist)
Возможность использования numpy.append
:
import numpy as np
rows = [[[1, 2, 3], [4]], [[5, 6], [7, 8]]]
result = np.array([np.append(value[0], value[1:]) for value in rows])
print(result)
Выход
[[1 2 3 4]
[5 6 7 8]]
Функция numpy.append
выравнивает значение [1:]. Один из вариантов заключается в использовании concatenate
и ravel
:
rows = [[[1], [2], [3]], [[4], [5], [6]]]
result = np.array([np.concatenate(value).ravel() for value in rows])
print(result)
Выход
[[1 2 3]
[4 5 6]]
Функция concatenate
объединяет последовательность массивов, а np.ravel
возвращает смежный сплющенный массив. Вы можете изменить np.ravel
на np.flatten.
rows = [[[1], [2], [3]], [[4], [5], [6]]]
throws Ошибка типа.
array([list([1, 2, 3]), list([4]), list([5, 6]), list([7, 8])], dtype=object)