我理解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
谢谢!
答案 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]]])