我正在尝试通过将2D数组与np.dstack一起使用来填充数组。
m1 = np.array([[1,1],[1,1]])
m2 = np.array([[2,2],[2,2]])
m3 = np.array([[3,3],[3,3]])
lst = m1
lst = np.dstack((lst,m2))
lst = np.dstack((lst,m3))
循环执行的正确方法是什么?我正在寻找类似的东西
lst = np.empty(...)
for _
lst = np.dstack((lst,variable2Darray))
答案 0 :(得分:1)
您不需要循环。您需要一个列表或数组元组:
m1 = np.array([[1,1],[1,1]])
m2 = np.array([[2,2],[2,2]])
m3 = np.array([[3,3],[3,3]])
arrays = m1, m2, m3 # A tuple of arrays
lst = np.dstack(arrays) # Stack them all
答案 1 :(得分:0)
无需在for
循环中执行此操作,您可以在传递给np.dstack
的元组中添加可变数量的矩阵,例如:
>>> np.dstack((m1, m2, m3))
array([[[1, 2, 3],
[1, 2, 3]],
[[1, 2, 3],
[1, 2, 3]]])
答案 2 :(得分:0)
如其他答案所示,您可以将数组放入列表中,并通过一次调用将它们加入新数组中:
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
。这比列表追加要昂贵。