如何将2d numpy数组列表连接成3d numpy数组?

xxx*_*222 0 python numpy

我尝试了很多,但没有一个concatenatevstack适合我.

hpa*_*ulj 5

你试过np.array吗?

np.array([[1,2],[3,4]])
Run Code Online (Sandbox Code Playgroud)

通过连接2个1d数组(列表)生成2d数组

同样

np.array([np.ones(3,3), np.zeros(3,3)]]
Run Code Online (Sandbox Code Playgroud)

应该产生一个(2,3,3)阵列.

np.stack功能使您可以更好地控制添加哪个轴.它的工作原理是将所有输入数组的维度扩展为1,并进行连接.

您可以自己扩展尺寸,例如

In [378]: A=np.ones((2,3),int)
In [379]: B=np.zeros((2,3),int)
In [380]: np.concatenate([A[None,:,:], B[None,:,:]], axis=0)
Out[380]: 
array([[[1, 1, 1],
        [1, 1, 1]],

       [[0, 0, 0],
        [0, 0, 0]]])
In [381]: _.shape
Out[381]: (2, 2, 3)
Run Code Online (Sandbox Code Playgroud)

要理解的关键事项是:

  • 匹配输入的维度 - 它们必须匹配除了正在连接的维度之外的所有维度

  • 根据需要扩大投入的规模.要连接2d数组以形成3d,2d必须首先扩展到3d.这个Nonenp.newaxis技巧特别有价值.

  • 沿右轴连接.

stack,hstack,vstack等一切有利于这一点,但一个技能numpy的用户应该能够直接与合作concatenate.在交互式会话中练习小样本.

In [385]: np.array((A,B)).shape
Out[385]: (2, 2, 3)
In [386]: np.stack((A,B)).shape
Out[386]: (2, 2, 3)
In [387]: np.stack((A,B),axis=1).shape
Out[387]: (2, 2, 3)
In [388]: np.stack((A,B),axis=2).shape
Out[388]: (2, 3, 2)
Run Code Online (Sandbox Code Playgroud)

如果数组的形状不同,np.array将创建一个对象dtype数组

In [389]: C=np.ones((3,3))
In [390]: np.array((A,C))
Out[390]: 
array([array([[1, 1, 1],
       [1, 1, 1]]),
       array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])], dtype=object)
In [391]: _.shape
Out[391]: (2,)
Run Code Online (Sandbox Code Playgroud)

dstack(和stack)将有不同大小的数组的问题:

In [392]: np.dstack((A,B,C))
....
ValueError: all the input array dimensions except for the concatenation axis must match exactly
Run Code Online (Sandbox Code Playgroud)