Python: Как изменить форму многомерного массива с различными измерениями? - PullRequest
0 голосов
/ 13 ноября 2018

Предположим, у меня есть такой массив

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

, и я хотел бы изменить его на

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

Есть ли простой способ сделать это в Python?Я знаю, что это очень просто, если 2-е измерение одинаково для всех данных, но в моем случае длина 2-го измерения составляет 2 и 3 соответственно.

Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Мы можем поспорить о том, является ли это списком списков или многомерным массивом, но concateante хорошо справляется с его сведением в массив 1d:

In [173]: alist = [[1,2], [3,4,5]]
In [175]: np.concatenate(alist, axis=0)
Out[175]: array([1, 2, 3, 4, 5])

Тогда его легко преобразовать вмассив формы (5,1):

In [176]: np.concatenate(alist, axis=0).reshape(-1,1)
Out[176]: 
array([[1],
       [2],
       [3],
       [4],
       [5]])

Существуют идиомы для сглаживания списка списков, но, поскольку вы пометили это как numpy, такой подход более очевиден.

In [177]: import itertools
In [178]: list(itertools.chain(*alist))
Out[178]: [1, 2, 3, 4, 5]
In [180]: [[x] for x in itertools.chain(*alist)]
Out[180]: [[1], [2], [3], [4], [5]]
0 голосов
/ 13 ноября 2018

Вы можете использовать механизм x for x in array:

>>> a = [[1,2], [3,4,5]]
>>> [[[a2] for a2 in a1] for a1 in a]
[[[1], [2]], [[3], [4], [5]]]
0 голосов
/ 13 ноября 2018

Если бы у вас был такой список:

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

, вы могли бы разделить его следующим образом:

nested_split = [[[single_elt] for single_elt in inside_list] for inside_list in nested]

, который бы выдает следующий вывод при вызове print:

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

Размерность внутреннего или внешнего списков никак не влияет на это решение, так как использование циклов for и понимание списка будет динамически приспосабливаться к любому размеру списка.

...