2016-01-12 1 views
2

У меня есть список, который принимает формуTurn несимметричного 3 размерного списка в 2-мерныме списка списков в Python

[[1,1],[2,2,2]],[[3,3],[4,4],[5,5,5]] 

, который при включении в Numpy массива становится

[[1 1],[2 2 2]], 
[[3 3 3],[4 4],[5 5 5]] 

поэтому, чтобы быть ясным, у меня есть список из 2 списков, и каждый из этих списков составлен из списков

Я хочу поместить его в форму

[[1,1],[2,2,2],[3,3],[4,4],[5,5,5]] 

или

[[1,1], 
[2 2 2], 
[3 3], 
[4 4], 
[5 5 5]] 

Flatten не работает, потому что он просто дает мне список всех компонентов, но я хочу, чтобы сохранить списки с теми же компонентами вместе, так что я в конечном итоге со списком списков , Также будут списки разных размеров, поэтому я не думаю, что функция reshape работает.

Другая проблема заключается в том, что в примере, который я дал, списки состоят из одного и того же числа, но в моем фактическом коде они представляют собой разные числа, поэтому я не могу просто сказать, чтобы он помещал все определенное число в каждый список.

Я надеюсь, что я ясно, если нет, то я попытаюсь прояснить

+0

Хотя это может быть сделано, используя NumPy с массивом типа 'object' (нет- регулярные строки формы) теряет большинство целей numpy (скорость, usabillity, применимость 'ufuncs'). –

ответ

2

Вы можете использовать две петли с list comprehension, он работает как для lists и np.arrays:

l = [[1,1],[2,2,2]],[[3,3],[4,4],[5,5,5]] 
result = [i for sublist in l for i in sublist] 
print(result) 
[[1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5]] 

Если вы не знакомы с list comprehension вы можете использовать обычные петли (эквивалент списка постижение раствора):

newlist = [] 
for sublist in l: 
    for i in sublist: 
     newlist.append(i) 

print(newlist) 
[[1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5]] 

EDIT:

Или вы могли бы использовать np.concatenate или np.hstack, как @Divakar предложил которые более читаемым, но исполнение ...:

In [225]: %timeit [i for sublist in l for i in sublist] 
1000000 loops, best of 3: 885 ns per loop 

In [227]: %timeit np.concatenate(l) 
100000 loops, best of 3: 4.12 us per loop 

In [226]: %timeit np.hstack(l) 
100000 loops, best of 3: 13.3 us per loop 

EDIT2

С @hpaulj комментарии вы можете использовать itertools.chain(*l) tp достижение по телефону list

import itertools 
In [315]: list(itertools.chain(*l)) 
Out[315]: [[1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5]] 

In [317]: %timeit list(itertools.chain(*l)) 
1000000 loops, best of 3: 876 ns per loop 

Таким образом, результаты почти такие же, как и для list comprension, могут быть немного быстрее.

+0

Спасибо! Я приму ваш ответ через несколько минут ... можете ли вы сказать мне, что это называется?я хотел бы найти дополнительную информацию об этом. Еще раз спасибо! – Alex

+0

Следуйте по ссылке в отредактированном ответе –

+0

Спасибо Антон! – Alex

3

Вы могли бы просто использовать np.concatenate -

np.concatenate(input_list) 

Пример запуска -

In [19]: input_list = [[1,1],[2,2,2]],[[3,3],[4,4],[5,5,5]] 

In [20]: np.concatenate(input_list) 
Out[20]: array([[1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5]], dtype=object) 
+0

Да, или 'np.hstack' –

+0

@AntonProtopopov Хорошо' np.hstack', 'np.vstack' и т. Д. Все используют' np.concatenate' под капотом, поэтому я думаю, что если 'np.concatenate' работает сразу , так что все хорошо! :) – Divakar

+1

Да, а также потому, что 'np.concatenate' в 3 раза быстрее, чем от производительности теста для этого случая. –

Смежные вопросы