Numpy:按最后一维堆叠数组
Numpy: stack array by the last dimension
假设我有 3 个形状相同的 numpy 数组 a
、b
、c
,比如
a.shape == b.shape == c.shape == (7,9)
现在我想创建一个大小为 (7,9,3)
的 3 维数组,比如 x
,这样
x[:,:,0] == a
x[:,:,1] == b
x[:,:,2] == c
"pythonic" 的实现方式是什么(也许在一行中)?
提前致谢!
有一个函数可以做到这一点:numpy.dstack
("d" 对应 "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
TL;DR:
使用 numpy.stack
(docs),它沿着您选择的新轴连接一系列数组。
尽管@NPE 的回答非常好并且涵盖了很多情况,但在某些情况下 numpy.dstack
不是正确的选择(我只是在尝试使用它时发现的)。那是因为 numpy.dstack
,根据 docs:
Stacks arrays in sequence depth wise (along third axis).
This is equivalent to concatenation along the third axis after 2-D
arrays of shape (M,N) have been reshaped to (M,N,1) and 1-D arrays of
shape (N,) have been reshaped to (1,N,1).
让我们来看一个不希望使用此功能的示例。假设您有一个包含 512 个形状为 (3, 3, 3)
的 numpy 数组的列表,并且想要堆叠它们以获得一个形状为 (3, 3, 3, 512)
的新数组。在我的例子中,这 512 个阵列是二维卷积层的过滤器。如果你使用 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
参数,因为我希望数组沿最后一个轴堆叠。
假设我有 3 个形状相同的 numpy 数组 a
、b
、c
,比如
a.shape == b.shape == c.shape == (7,9)
现在我想创建一个大小为 (7,9,3)
的 3 维数组,比如 x
,这样
x[:,:,0] == a
x[:,:,1] == b
x[:,:,2] == c
"pythonic" 的实现方式是什么(也许在一行中)?
提前致谢!
有一个函数可以做到这一点:numpy.dstack
("d" 对应 "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
TL;DR:
使用 numpy.stack
(docs),它沿着您选择的新轴连接一系列数组。
尽管@NPE 的回答非常好并且涵盖了很多情况,但在某些情况下 numpy.dstack
不是正确的选择(我只是在尝试使用它时发现的)。那是因为 numpy.dstack
,根据 docs:
Stacks arrays in sequence depth wise (along third axis).
This is equivalent to concatenation along the third axis after 2-D arrays of shape (M,N) have been reshaped to (M,N,1) and 1-D arrays of shape (N,) have been reshaped to (1,N,1).
让我们来看一个不希望使用此功能的示例。假设您有一个包含 512 个形状为 (3, 3, 3)
的 numpy 数组的列表,并且想要堆叠它们以获得一个形状为 (3, 3, 3, 512)
的新数组。在我的例子中,这 512 个阵列是二维卷积层的过滤器。如果你使用 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
参数,因为我希望数组沿最后一个轴堆叠。