Просто чтобы рассмотреть 1d случай:
In [33]: x = np.array([[1,2],[1,2,3]])
In [34]: x.shape
Out[34]: (2,)
In [35]: x
Out[35]: array([list([1, 2]), list([1, 2, 3])], dtype=object)
В результате получается массив из 2 элементов списков, где, как мы начали со списка списков.Не большая разница.
Но учтите, что если списки имеют одинаковый размер, np.array
создает числовой двумерный массив:
In [36]: x = np.array([[1,2,4],[1,2,3]])
In [37]: x
Out[37]:
array([[1, 2, 4],
[1, 2, 3]])
Так что не рассчитывайте на поведение, которое мы видим в [33].
Я мог бы создать массив двумерных объектов:
In [59]: x = np.empty((2,2),object)
In [60]: x
Out[60]:
array([[None, None], # in this case filled with None
[None, None]], dtype=object)
Я могу назначить каждому элементу объект другого типа и размера:
In [61]: x[0,0] = np.arange(3)
In [62]: x[0,0] = [1,2,3]
In [63]: x[1,0] = 'abc'
In [64]: x[1,1] = np.arange(6).reshape(2,3)
In [65]: x
Out[65]:
array([[list([1, 2, 3]), None],
['abc', array([[0, 1, 2],
[3, 4, 5]])]], dtype=object)
Этовсе еще 2d.Для большинства целей это как список или список списков, содержащих объекты.Буфер данных на самом деле имеет указатели на объекты, хранящиеся где-то еще в памяти (как в буфере списка).
На самом деле не существует такого понятия, как трехмерный массив с переменной last измерением.В лучшем случае мы можем получить 2d массив, который содержит списки или массивы различных размеров.
Создайте список из 2 2d массивов:
In [69]: alist = [np.arange(6).reshape(2,3), np.arange(4.).reshape(2,2)]
In [70]: alist
Out[70]:
[array([[0, 1, 2],
[3, 4, 5]]), array([[0., 1.],
[2., 3.]])]
В этом случае, передав егоnp.array
выдает ошибку: в [71]: np.array (alist)
--------------------------------------------------------------------------- ValueError: не удалосьшироковещательный входной массив из shape (2,3) в shape (2)
Мы могли бы заполнить массив объектов элементами из этого списка:
In [72]: x = np.empty((4,),object)
In [73]: x[0]=alist[0][0]
In [74]: x[1]=alist[0][1]
In [75]: x[2]=alist[1][0]
In [76]: x[3]=alist[1][1]
In [77]: x
Out[77]:
array([array([0, 1, 2]), array([3, 4, 5]), array([0., 1.]),
array([2., 3.])], dtype=object)
и изменить его на 2d
In [78]: x.reshape(2,2)
Out[78]:
array([[array([0, 1, 2]), array([3, 4, 5])],
[array([0., 1.]), array([2., 3.])]], dtype=object)
Результатом является 2d массив, содержащий 1d массивы.Чтобы получить формы элементов, я должен сделать что-то вроде:
In [87]: np.frompyfunc(lambda i:i.shape, 1,1)(Out[78])
Out[87]:
array([[(3,), (3,)],
[(2,), (2,)]], dtype=object)