如何在循环中使用numpy.dstack?

时间:2018-11-03 21:28:14

标签: python numpy

我正在尝试通过将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))

3 个答案:

答案 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。这比列表追加要昂贵。