Как полностью сгладить список в Python? [Дубликат]

1

Сглаживание списков списков является хорошо известной проблемой, но как сгладить список списков списков наиболее пифонов? Моя конечная цель - создать массив 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)
  • 1
    Просто чтобы понять проблему, как вы могли бы иметь циклическое решение для решения вашего примера?
  • 0
    На самом деле многие решения, которые выглядят заманчиво, сначала возвращают array([list([1, 2, 3]), list([4]), list([5, 6]), list([7, 8])], dtype=object)
Показать ещё 2 комментария
Теги:
optimization
numpy
itertools
flatten

1 ответ

0

Возможность использования 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.

  • 1
    Хорошая идея, но она терпит неудачу, когда строки содержат более двух списков ... rows = [[[1], [2], [3]], [[4], [5], [6]]] throws Ошибка типа.
  • 0
    append делает много перемещений. Это не амортизируется вообще, в отличие от добавления и расширения списка. Все еще хорошая мысль.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню