在python的numpy库中有一个函数np.stack(), 看过一些博文后以为别人写的太复杂,而后本身有了一些理解以后作了一些比较简单的解释python
首先stack函数用于堆叠数组,其调用方式以下所示:数组
np.stack(arrays,axis=0)函数
其中arrays即须要进行堆叠的数组,axis是堆叠时使用的轴,好比:spa
arrays = [[1,2,3,4], [5,6,7,8]]code
这是一个二维数组,axis=0表示的是第一维,也便是arrays[0] = [1,2,3,4]或者arrays[1] = [5,6,7,8]input
axis=i时,表明在堆叠时首先选取第i维进行“打包”string
具体例子:io
当执行np.stack(arrays, axis=0)时,取出第一维的一、二、三、4,打包,[1, 2, 3, 4],其他的相似,而后结果以下:ast
当执行np.stack(arrays, axis=1)时,先对arrays中的第二维进行“打包”,也便是将一、5打包成[1, 5],其他的相似,结果以下:class
有这个“打包”的概念后,对于三维的数组堆叠也不难理解了,例如:
a = np.array([[1,2,3,4], [5,6,7,8]])
arrays = np.asarray([a, a , a])
执行np.stack(arrays, axis=0),也就是对第一维进行打包,结果以下:
执行np.stack(arrays, axis=1),也就是对第二维进行打包,取出第二维的元素[1,2,3,4]、[1,2,3,4]、[1,2,3,4],打包,[[1,2,3,4],[1,2,3,4],[1,2,3,4]],对其他的也作相似处理,结果以下:
执行np.stack(arrays, axis=2),与以前相似,取出第三维元素一、一、1,打包[1,1,1],结果以下:
总结而言,也就是arrays是你要进行堆叠的数组,axis控制你要将arrays中哪一个维度组合起来(也就是文中的“打包”)。
np.concatenate((a1,a2,a3,...), axis=0),这个函数就是按照特定方向轴进行拼接,默认是第一维,在numpy官网上的示例以下:
当axis=0时,将b的元素加到a的尾部,这里比较难以理解的是第二个np.concatenate((a, b.T), axis=1),其实也相似,b.T的shape为(1,2),axis=1,则在a的第二维加上b的每一个元素,因此这里axis=i时, 输入参数(a1,a2,a3...)除了第i维,其他维度的shape应该一致,例如:
这里a的shape为(2,2,3),b的shape为(1,2,3),axis=0则要求a,b在其余两维的形状是一致的,若是直接在其余维度进行concatenate操做则会报错(由于axis=1时,a和b在第一维的长度不一致):
下面一个例子可以说明:
np.hstack(tup), 按照列的方向堆叠, tup能够是元组,列表,或者numpy数组, 其实也就是axis=1,即
np.hstack(tup) = np.concatenate(tup, axis=1)
按照上面对concatenate的理解则下面的示例很好理解
np.vstack(tup), 按照行的方向堆叠, tup能够是元组,列表,或者numpy数组, 理解起来与上相同
np.vstack(tup) = np.concatenate(tup, axis=0)
对于第二段代码,a的第一维元素分别时[1],[2],[3],因此堆叠时将b的对应元素直接加入
np.dstack(tup), 按照第三维方向堆叠,也便是
np.dstack(tup) = np.concatenate(tup, axis=2), 这里较好理解,因此直接放官网的示例
np.column_stack函数将一维的数组堆叠为二维数组,方向为列
np.row_stack函数将一维的数组堆叠为二维数组,方向为行
其实若是对前面的内容理解以后这两个算是比较简单的了
其实也就是两种操做,stack和concatenate,其中stack是首先找到axis轴的元素,而后对该轴的元素进行组合,而后造成新的数组,而concatenate则是在axis轴进行拓展,将a1,a2,a3...按照axis指定的轴进行增长操做...