Numpy:最后一个维度的堆栈数组

时间:2015-01-04 19:47:58

标签: python numpy multidimensional-array

假设我有3个numpy数组abc,形状相同,比如说

a.shape == b.shape == c.shape == (7,9)

现在我想创建一个大小为(7,9,3)的三维数组,比如x,这样

x[:,:,0] == a
x[:,:,1] == b
x[:,:,2] == c

什么是" pythonic"这样做的方式(也许是一行)?

提前致谢!

2 个答案:

答案 0 :(得分:6)

有一个功能正是如此:numpy.dstack(" d" for" depth")。例如:

In [10]: import numpy as np

In [11]: a = np.ones((7, 9))

In [12]: b = a * 2

In [13]: c = a * 3

In [15]: x = np.dstack((a, b, c))

In [16]: x.shape
Out[16]: (7, 9, 3)

In [17]: (x[:, :, 0] == a).all()
Out[17]: True

In [18]: (x[:, :, 1] == b).all()
Out[18]: True

In [19]: (x[:, :, 2] == c).all()
Out[19]: True

答案 1 :(得分:0)

TL;DR:

使用 numpy.stack (docs),它沿着您选择的新轴连接一系列数组。


虽然@NPE 的回答非常好并且涵盖了很多情况,但在某些情况下 numpy.dstack 不是正确的选择(我刚刚在尝试使用它时发现了这一点)。这是因为 numpy.dstack,根据 docs:

<块引用>

按深度顺序(沿第三轴)堆叠数组。

这相当于在二维之后沿第三个轴串联 形状为 (M,N) 的数组已被重新整形为 (M,N,1) 和一维数组 形状 (N,) 已被重新整形为 (1,N,1)。

让我们看一个不希望使用此函数的示例。假设您有一个包含 512 个形状为 (3, 3, 3) 的 numpy 数组的列表,并且想要将它们堆叠起来以获得形状为 (3, 3, 3, 512) 的新数组。就我而言,这 512 个阵列是 2D 卷积层的过滤器。如果您使用 numpy.dstack

>>> len(arrays_list)
512
>>> arrays_list[0].shape
(3, 3, 3)
>>> numpy.dstack(arrays_list).shape
(3, 3, 1536)

那是因为 numpy.dstack 总是沿着第三个轴堆叠数组!或者,您应该使用 numpy.stack (docs),它沿着您选择的新轴连接一系列数组:

>>> numpy.stack(arrays_list, axis=-1).shape
(3, 3, 3, 512)

就我而言,我将 -1 传递给 axis 参数,因为我希望数组沿最后一个轴堆叠。