Конструктор
numpy
array
может обрабатывать итерации произвольного размера. Единственное условие состоит в том, что они не могут быть неровными (то есть каждая «строка» в каждом измерении должна иметь одинаковую длину).
Вот пример:
In [1]: list_3d = [[['a', 'b', 'c'], ['d', 'e', 'f']], [['g', 'h', 'i'], ['j', 'k', 'l']]]
In [2]: import numpy as np
In [3]: np.array(list_3d)
Out[3]:
array([[['a', 'b', 'c'],
['d', 'e', 'f']],
[['g', 'h', 'i'],
['j', 'k', 'l']]], dtype='<U1')
In [4]: array_3d = np.array(list_3d)
In [5]: array_3d[0,0,0]
Out[5]: 'a'
In [6]: array_3d.shape
Out[6]: (2, 2, 3)
Если массив имеет значение с зубчатыми краями, numpy
будет "сдавливаться" до размера, в котором возникает зубчатая ность. Поскольку это объяснение ясно как грязь, пример может помочь:
In [20]: jagged_3d = [ [['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h'], ['i', 'j']] ]
In [21]: jagged_arr = np.array(jagged_3d)
In [22]: jagged_arr.shape
Out[22]: (2,)
In [23]: jagged_arr
Out[23]:
array([list([['a', 'b'], ['c', 'd']]),
list([['e', 'f'], ['g', 'h'], ['i', 'j']])], dtype=object)
Причина, по которой конструктор не работает "из коробки", заключается в том, что у вас есть зубчатый массив. numpy
просто не поддерживает зубчатые массивы из-за того, что каждый массив numpy
имеет четко определенный shape
, представляющий длину каждого измерения. Поэтому, если элементы в данном измерении имеют разную длину, эта абстракция распадается, и numpy
просто не позволяет этого.
НТН.