Составьте список массивов с разными формами (но с одинаковым количеством элементов):
In [72]: alist = [np.ones((2,3),int),np.zeros(6,int),np.arange(6)]
In [73]: alist
Out[73]:
[array([[1, 1, 1],
[1, 1, 1]]), array([0, 0, 0, 0, 0, 0]), array([0, 1, 2, 3, 4, 5])]
In [74]: np.array(alist)
Out[74]:
array([array([[1, 1, 1],
[1, 1, 1]]), array([0, 0, 0, 0, 0, 0]),
array([0, 1, 2, 3, 4, 5])], dtype=object)
В результате получается массив типа dtype.
Но если мы изменим все элементы списка в одну и ту же форму, мы получим трехмерный массив:
In [75]: np.array([x.reshape(2,3) for x in alist])
Out[75]:
array([[[1, 1, 1],
[1, 1, 1]],
[[0, 0, 0],
[0, 0, 0]],
[[0, 1, 2],
[3, 4, 5]]])
Теперь давайте попробуем изменить форму элементов после создания массива:
In [76]: arr = np.array(alist)
In [77]: arr.shape
Out[77]: (3,)
In [78]: for i in range(3):
...: arr[i] = arr[i].reshape(2,3)
...:
In [79]: arr
Out[79]:
array([array([[1, 1, 1],
[1, 1, 1]]),
array([[0, 0, 0],
[0, 0, 0]]),
array([[0, 1, 2],
[3, 4, 5]])], dtype=object)
In [80]: np.array(arr)
Out[80]:
array([array([[1, 1, 1],
[1, 1, 1]]),
array([[0, 0, 0],
[0, 0, 0]]),
array([[0, 1, 2],
[3, 4, 5]])], dtype=object)
Вызов array
в этом массиве ничего не меняет.
Но stack
работает (stack
- это просто удобная версия concatenate
):
In [82]: np.stack(arr)
Out[82]:
array([[[1, 1, 1],
[1, 1, 1]],
[[0, 0, 0],
[0, 0, 0]],
[[0, 1, 2],
[3, 4, 5]]])
stack
принимает список массивов или массив, итерирует по 1-му измерению:
In [83]: np.stack([x for x in arr])
Out[83]:
array([[[1, 1, 1],
[1, 1, 1]],
[[0, 0, 0],
[0, 0, 0]],
[[0, 1, 2],
[3, 4, 5]]])