在dumpy中坚持使用dstack和dsplit

时间:2014-03-17 15:55:55

标签: python numpy

我理解hstack,hsplit和vstack以及vsplit 但我并没有得到dstack和dsplit的工作方式。

根据我在第三维上连接的意思是:>

a = 1st 2D matrix
b = 2nd 2D matrix
c = 3rd 2D matrix

d = np.dstack((a, b, c))

d[0] == a
d[1] == b
d[2] == c

现在这应该意味着深度堆叠并且真正有意义(至少对我而言) 但这种情况并非如此。 请帮我看看dstack和dsplit

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为你正在以正确的方式思考它。即想象阵列是垂直堆叠的......

就像docs说:

  

取一系列数组并垂直堆叠以制作一个数组   阵列

想象一下,a,b和c是方形和堆叠形成一个立方体。查看第一维,d[0](相当于d[0,:,:])将查看多维数据集的一侧,d[:,0,:]也是如此。第三个维度从上面看,例如, d[:,:,0]。使用.ndim.shape来计算尺寸和形状的数量会很有帮助。

举例说明:

>>> a =np.ones((3,3))
>>> b =a*2
>>> c =a*3
>>> np.dstack((a, b, c))
>>> a.shape
(3, 3)
>>> a.ndim
2
>>> d.shape
(3, 3, 3)
>>> d.ndim
3
>>> d[0,:,:]
array([[ 1.,  2.,  3.],
       [ 1.,  2.,  3.],
       [ 1.,  2.,  3.]])
>>> d[:,0,:]
array([[ 1.,  2.,  3.],
       [ 1.,  2.,  3.],
       [ 1.,  2.,  3.]])
>>> d[:,:,0]
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])
>>> d[:,:,1]
array([[ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])

最后,如果您想旋转多维数据集,可以随时转置数组:

>>> d.T
array([[[ 1.,  1.,  1.],
        [ 1.,  1.,  1.],
        [ 1.,  1.,  1.]],

       [[ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.]],

       [[ 3.,  3.,  3.],
        [ 3.,  3.,  3.],
        [ 3.,  3.,  3.]]])

>>> d.T[0]
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])

修改

....或者您可以使用rollaxis

>>> np.rollaxis(d,2)
array([[[ 1.,  1.,  1.],
        [ 1.,  1.,  1.],
        [ 1.,  1.,  1.]],

       [[ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.]],

       [[ 3.,  3.,  3.],
        [ 3.,  3.,  3.],
        [ 3.,  3.,  3.]]])

答案 1 :(得分:1)

dstack((a,b,c))dstack(map(atleast_3d, [a,b,c]))相同,因此您只需要了解atleast_3d的工作原理。这很简单,它只增加了第三个尺寸1的尺寸:

>>> a = np.random.randn(2, 3)
>>> np.atleast_3d(a)
array([[[ -1.47499777e-04],
        [ -3.15172826e-01],
        [ -4.17205640e-01]],

       [[ -4.40166377e-01],
        [ -3.49488016e-01],
        [  1.20570170e+00]]])