Как показали другие ответы, вы можете поместить массивы в список и объединить их в новый массив одним вызовом:
In [173]: m1 = np.array([[1,1],[1,1]])
...: m2 = np.array([[2,2],[2,2]])
...: m3 = np.array([[3,3],[3,3]])
...:
...:
In [174]: alist = [m1,m2,m3]
In [175]: np.stack(alist)
Out[175]:
array([[[1, 1],
[1, 1]],
[[2, 2],
[2, 2]],
[[3, 3],
[3, 3]]])
У numpy первая ось - самая внешняя. В отличие от MATLAB последняя ось является самой внешней. Таким образом, stack
(или np.array(alist)
) является естественным эквивалентом. Но если вам нужно присоединиться к ним по новой внутренней оси, используйте:
In [176]: np.stack(alist,axis=2) # or np.dstack(alist)
Out[176]:
array([[[1, 2, 3],
[1, 2, 3]],
[[1, 2, 3],
[1, 2, 3]]])
Или, если вы создаете массивы по одному, используйте добавление в список:
In [177]: alist = []
In [178]: for a in m1,m2,m3:
...: alist.append(a)
Возможно, самая близкая вещь к вашему MATLAB:
In [181]: arr = np.zeros((2,2,3),int)
In [183]: for i,m in enumerate([m1,m2,m3]):
...: arr[:,:,i] = m
for i=1:10
var = some2Dmatrix
A(:,:,i) = var;
end
В отличие от MATLAB numpy
не просто добавляет слой при индексировании сверх текущего размера. Я также подозреваю, что код MATLAB на самом деле скрывает некоторый дорогостоящий код изменения размера матрицы. Это не то, что я делал много лет назад, когда профессионально использовал MATLAB.
Но чтобы ответить на вопрос, на который мы не хотим отвечать:
In [185]: arr = np.zeros((2,2,0),int) # your empty(?)
In [187]: for m in (m1,m2,m3):
...: arr = np.concatenate((arr, m[:,:,None]), axis=2)
In [188]: arr.shape
Out[188]: (2, 2, 3)
Если вы не понимаете деталей этой итерации, вам, вероятно, не следует пытаться создать массив большего размера с повторными concatenate
(или dstack
). Вы должны получить правильную начальную форму arr
и правильную форму массива итераций. Плюс это делает новый arr
с каждой петлей. Это дороже, чем добавление в список.