numpy中的stack,vstack与hstack新解
查了一下,发现网上好多人的解释都不对,很多人打算用数组“打包”等过程来解释stack函数操作过程,要么举的例子太简单没有代表性,要么举的例子太复杂,看得人头疼。
其实,没有必要去了解这个函数是怎么操作数组的,按照官方的文档来看,对于这个函数,大家只需要了解两点即可,不必弄得太清楚明白:
- 这个函数是用来堆叠数组的;
- 这个函数所返回的数组的形状
第一点不必多言,关于第二点,官方文档给出的答案是:
返回的数组比原来的数组多一维。
但关键的问题是,多的那一维是加到了第几维?假设有S个MN的数组进行堆叠,那堆叠之后的数组到底是是SMN,MSN还是MNS呢?其实呢,这就是参数axis的作用。axis=0,那堆叠后的数组形状是SMN,如果axis=1,堆叠后的形状将是MS*N。依此类推。
关于参数axis的解释,官方文档其实有点难懂,但是它说的的确很准确,它可以用如下例子解释:
比如有10个形状为(4,3)的矩阵
arrays = [np.random.randn(3, 4) for _ in range(10)]
调用stack之后,axis=0,则多出一这一维加在第一维,变成一个(10, 3, 4)的矩阵,堆叠几个数组,新增的维度的长度就是几:
np.stack(arrays, axis=0).shape
#(10, 3, 4)
同样的解释:
np.stack(arrays, axis=1).shape
#(3, 10, 4)
np.stack(arrays, axis=2).shape
#(3, 4, 10)
最后再解释一下为什么没有必要弄清楚数组堆叠的过程:
- 多维数组,我们更关心它的形状;
- 理解这个堆叠过程需要的思维与人的思维差异太大,换言之,理解这个过程太烧脑,太费时,无益
vstack与hstack
这两个函数可以看成数组拼接。
vstack沿竖直方向拼接:
vstack(a, b) = \begin{bmatrix}
a \\
b
\end{bmatrix}
例如:
a = np.array([[1], [2], [3]])
b = np.array([[2], [3], [4]])
np.vstack((a,b))
#array([[1], [2], [3], [2], [3], [4]])
hstack沿竖直方向拼接:
hstack(a, b) = \begin{bmatrix}
a &
b
\end{bmatrix}
例如:
a = np.array([[1], [2], [3]])
b = np.array([[2], [3], [4]])
np.vstack((a,b))
# array([[1, 2], [2, 3], [3, 4]])