Список списків до масивного масиву


184

Як перетворити простий список списків в масивний рядок? Рядки є окремими підсписками, і кожен рядок містить елементи підспису.

Відповіді:


199

Якщо ваш список списків містить списки з різною кількістю елементів, то відповідь Ігнасіо Васкеса-Абрамса не спрацює. Натомість є щонайменше 3 варіанти:

1) Створіть масив масивів:

x=[[1,2],[1,2,3],[1]]
y=numpy.array([numpy.array(xi) for xi in x])
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'numpy.ndarray'>

2) Складіть масив списків:

x=[[1,2],[1,2,3],[1]]
y=numpy.array(x)
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'list'>

3) Спочатку зробіть списки рівними за довжиною:

x=[[1,2],[1,2,3],[1]]
length = max(map(len, x))
y=numpy.array([xi+[None]*(length-len(xi)) for xi in x])
y
>>>array([[1, 2, None],
>>>       [1, 2, 3],
>>>       [1, None, None]], dtype=object)

15
Спасибі, прийшов сюди за це. Деякий час використовували numpy і вважали таку поведінку нетривіальною. Дякуємо, що знайшли час для пояснення цього більш загального випадку.
Адам Хьюз

dtype=floatпрацює також, вона перетвориться Noneна np.nan, що може бути корисно.

108
>>> numpy.array([[1, 2], [3, 4]]) 
array([[1, 2], [3, 4]])

13
це автоматично перетворює список списку у двовимірний масив, оскільки довжина всіх включених списків однакова. Чи знаєте ви, як цього не зробити: складіть масив списку, навіть якщо всі списки мають однакову довжину? Або можливо перетворити 2D масив у 1D масив 1D масиву (я маю на увазі ефективно, немає жодного ітеративного методу чи матеріалу python)
Juh_

7
Якщо це не працює для вас, оскільки ваші підлісти не мають рівних розмірів, див . Наступну відповідь .
Nikana Reklawyks

@NikanaReklawyks Я розгубився після перегляду відповіді, але ваш коментар був корисним. Я дізнався, що мій список списків був нерівним, коли цього не повинно було бути.
Нікіл Гіррай

39

Оскільки це найпопулярніший пошук в Google для перетворення списку списків у масив Numpy, я запропоную наступне, незважаючи на 4 роки:

>>> x = [[1, 2], [1, 2, 3], [1]]
>>> y = numpy.hstack(x)
>>> print(y)
[1 2 1 2 3 1]

Коли я вперше подумав зробити це саме так, я був дуже задоволений собою, оскільки це так просто. Однак, приурочивши його до більшого списку списків, це реально зробити швидше:

>>> y = numpy.concatenate([numpy.array(i) for i in x])
>>> print(y)
[1 2 1 2 3 1]

Зауважте, що відповідь №1 @ Bastiaan не складає жодного безперервного списку, отже, я додав відповідне concatenate.

У будь-якому випадку ... я віддаю перевагу hstackпідходу для елегантного використання Numpy.


12
хоча деякі люди можуть це шукати, я впевнений, що ОП хотів багатовимірного nparr.
Натан

1
Я шукав це :))
Паллі


6

Знову ж таки, після пошуку проблеми перетворення вкладених списків з N рівнів у N-мірний масив я нічого не знайшов, тож ось мій шлях:

import numpy as np

new_array=np.array([[[coord for coord in xk] for xk in xj] for xj in xi], ndmin=3) #this case for N=3

Зауважте, що якщо ви вже маєте структуру вкладених списків, [...[...[...]]]частина вам не потрібна . Вам просто потрібно зателефонувати np.array, з ndmin=number-of-list-layers. (хоча в моєму випадку мені потрібно було ndmin=number-of-list-layers-minus-1чомусь, інакше створили додатковий шар - потрібно дослідити)
Венрікс,

Ну гаразд, проблема в моєму випадку полягає в тому, що для найглибшого "шару списків" списки не мають однакової довжини, що спричинило np.arrayпросто "загортання" цих найглибших списків, а не перетворення їх у нумерові масиви.
Венрікс

-2

У мене був список списків однакової довжини. Вже тоді Ignacio Vazquez-Abramsвідповідь мені не вийшла. Я отримав 1-D numpy масив, елементами якого є списки. Якщо ви зіткнулися з тією ж проблемою, ви можете скористатися наведеним нижче методом

Використовуйте numpy.vstack

import numpy as np

np_array = np.empty((0,4), dtype='float')
for i in range(10)
     row_data = ...   # get row_data as list
     np_array = np.vstack((np_array, np.array(row_data)))

1
чому на землі ви б продовжували складати, якщо знаєте, що у вас є 10 списків, чому б не np.empty ((10, 4)), а потім просто заповнити його?
Мехді

-4

Просто використовуйте панди

list(pd.DataFrame(listofstuff).melt().values)

це працює лише для списку списків

якщо у вас є список списків, ви можете спробувати щось в порядку

lists(pd.DataFrame(listofstuff).melt().apply(pd.Series).melt().values)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.