卡在numpy的dstack和dsplit上

1 投票
2 回答
982 浏览
提问于 2025-04-17 22:41

我明白了 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 个回答

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]]])
2

我觉得你想的方向是对的。也就是说,可以想象这些数组是垂直叠放在一起的……

就像文档里说的:

把一系列数组垂直叠放,形成一个单一的数组。

想象一下,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.]]])

撰写回答