Вы создали странную структуру; вы не можете просто изменить его форму:
In [1]: dtypes = [('a', np.float64), ('b', object)]
...: nda = np.zeros((2,2), dtype = dtypes)
...:
...: nda['b'][0,0] = [1,2]
...: nda['b'][1,0] = [2,3]
...: nda['b'][0,1] = [3,4]
...: nda['b'][1,1] = [9,5]
Он имеет 2 поля, одно с числами, другое со списками:
In [2]: nda
Out[2]:
array([[(0., list([1, 2])), (0., list([3, 4]))],
[(0., list([2, 3])), (0., list([9, 5]))]],
dtype=[('a', '<f8'), ('b', 'O')])
Поле списка:
In [3]: nda['b']
Out[3]:
array([[list([1, 2]), list([3, 4])],
[list([2, 3]), list([9, 5])]], dtype=object)
In [4]: _.shape
Out[4]: (2, 2)
Если преобразовать в 1d, мы можем stack
(или иным образом объединить с concatenate
):
In [5]: nda['b'].ravel()
Out[5]:
array([list([1, 2]), list([3, 4]), list([2, 3]), list([9, 5])],
dtype=object)
In [6]: np.stack(nda['b'].ravel())
Out[6]:
array([[1, 2],
[3, 4],
[2, 3],
[9, 5]])
In [7]: np.stack(nda['b'].ravel()).reshape(2,2,2)
Out[7]:
array([[[1, 2],
[3, 4]],
[[2, 3],
[9, 5]]])
В общем, если у вас есть массив списков или массивов dtype, его можно объединить в один (numeri c) массив с версией сортировки concatenate
, но он должен быть 1d, `` повторяемый '' массивов / списков.
И, да, распаковка поля во вложенный список дает что-то, что может быть преобразовано обратно в массив (2,2,2):
In [14]: _2['b'].tolist()
Out[14]: [[[1, 2], [3, 4]], [[2, 3], [9, 5]]]
(Вы не можете просто поместить эти массивы (или списки) обратно в массив nda
. Тип dtype равен неправильно.)
С другим dtype
(поле `b состоит из 2 целых чисел, а не более общего c объекта):
In [10]: dtypes = [('a', np.float64), ('b', int, (2,))]
...: nda = np.zeros((2,2), dtype = dtypes)
...:
...: nda['b'][0,0] = [1,2]
...: nda['b'][1,0] = [2,3]
...: nda['b'][0,1] = [3,4]
...: nda['b'][1,1] = [9,5]
In [11]: nda
Out[11]:
array([[(0., [1, 2]), (0., [3, 4])],
[(0., [2, 3]), (0., [9, 5])]],
dtype=[('a', '<f8'), ('b', '<i8', (2,))])
In [12]: nda['b']
Out[12]:
array([[[1, 2],
[3, 4]],
[[2, 3],
[9, 5]]])