Когда вы пытаетесь создать массив из массивов, возможны три результата:
Если массивы имеют одинаковую форму, результатом является массив более высокой размерности:
In [295]: np.array((np.zeros((2,3),int),np.ones((2,3),int)))
Out[295]:
array([[[0, 0, 0],
[0, 0, 0]],
[[1, 1, 1],
[1, 1, 1]]])
In [296]: _.shape
Out[296]: (2, 2, 3)
ЕслиМассивы различаются по форме, результатом может быть массив типа dtype (похожий на list
):
In [298]: np.array((np.zeros((2,3),int),np.ones((3,3),int)))
Out[298]:
array([array([[0, 0, 0],
[0, 0, 0]]),
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])], dtype=object) # shape (2,)
Но для некоторых комбинаций фигур результатом является ошибка:
In [301]: np.array((np.zeros((2,3),int),np.ones((2,4),int)))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-301-d67e6685581d> in <module>
----> 1 np.array((np.zeros((2,3),int),np.ones((2,4),int)))
ValueError: could not broadcast input array from shape (2,3) into shape (2)
В случае ошибки первые измерения совпадают, как и в первом случае.
Иногда для создания массива объектов необходимо начинать с «пустого» и заполнять его.Это более надежно, чем подход np.array(...)
.
In [303]: arr = np.empty(2, object)
In [304]: arr[:] = np.zeros((2,3),int),np.ones((2,4),int)
In [305]: arr
Out[305]:
array([array([[0, 0, 0],
[0, 0, 0]]),
array([[1, 1, 1, 1],
[1, 1, 1, 1]])], dtype=object)
In [306]: arr[:] = np.zeros((2,3),int),np.ones((2,3),int)
In [307]: arr
Out[307]:
array([array([[0, 0, 0],
[0, 0, 0]]),
array([[1, 1, 1],
[1, 1, 1]])], dtype=object)