Numpy数组的组合与分割实现的方法( 二 )


axis=0:数组将沿着这个轴组合 , 如果坐标轴为None , 数组在使用前被平铺 。int型数据 , 可选参数 , 默认为零 。
2.垂直组合vstack函数与concatenate函数
2.1vstack函数:垂直连接多个数组 。参数如上 。
2.2concatenate函数:改一下轴参数就好 。
水平组合和垂直组合是比较直观的说法 , 因为我们用的最多的数组就是一维和二维;实际上 , 它们分别是沿着第二条轴(水平) , 第一条轴(垂直)进行组合 。
a=np.array([1])a=a.reshape(1,1,1,1,1)#只有一个元素的五维数组b=np.array([1])b=b.reshape(1,1,1,1,1)#与a完全相同c=np.hstack((a,b))#水平组合d=np.vstack((a,b))#垂直组合print(c)print(d)print(c.shape)print(d.shape)'''水平组合[[[[[1]]][[[1]]]]]垂直组合[[[[[1]]]] [[[[1]]]]] c的形状(1, 2, 1, 1, 1) d的形状(2, 1, 1, 1, 1)'''
3.行组合和列组合3.1row_stack函数:行组合
将一维数组按行方向组合起来 , 对于二维数组完全等同于vstack 。对于多维数组 , 实际上就是沿第一个轴进行组合 。
3.2colum_stack函数:列组合
将一维数组按列方向组合起来 , 对于二维数组完全等同于hstack 。对于多维数组 , 实际上就是沿第二个轴进行组合 。
a=np.array([0,1,2])b=np.array([1,2,3])c=np.row_stack((a,b))d=np.column_stack((a,b))print(c)print(d)'''行组合[[0 1 2] [1 2 3]]列组合[[0 1] [1 2] [2 3]]'''a=np.array([0,1,2]).reshape(1,1,1,1,3)b=np.array([1,2,3]).reshape(1,1,1,1,3)c=np.row_stack((a,b))d=np.column_stack((a,b))print(c)print(d)print(c.shape)print(d.shape)'''行组合[[[[[0 1 2]]]] [[[[1 2 3]]]]][[[[[0 1 2]]]列组合[[[1 2 3]]]]]c形状(2, 1, 1, 1, 3)d形状(1, 2, 1, 1, 3)'''
4.深度组合沿着第三个轴进行组合 。
a=np.array([0,1,2])b=np.array([1,2,3])c=np.dstack((a,b))#深度组合print(c)print(a.shape)print(c.shape)'''[[[0 1][1 2][2 3]]](3,)(1, 3, 2)'''a=np.array([0,1,2]).reshape(1,1,1,3)b=np.array([1,2,3]).reshape(1,1,1,3)c=np.dstack((a,b))print(c.shape)'''(1, 1, 2, 3)'''
当数组维度比较小的时候 , 比如一维和二维 , 如果组合时没有第二和第三参数 , 函数会自动为其在形状左侧补1 , 也就是拓展一层 。这和之前说过的广播机制十分类似 。
数组的分割数组可以进行水平 , 垂直等方式进行分割 。相关函数:hsplit , vsplit , dsplit , split 。
我们可以将数组分割成相同大小(形状)的子数组 , 也可以指定分割的位置 。
1.水平分割hsplit函数和split函数 。
沿水平方向 , 就是沿列方向 , 沿第二条轴(axis=1)方向 。
1.1hsplit函数格式:hsplit(ary, indices_or_sections)
第一个参数是数组;第二个参数是一个整数或列表 , 如果不指定 , 就会分割成相同大小的子数组 。
a=np.arange(16).reshape(4,4)pp.pprint(a)pp.pprint(np.hsplit(a,2))#平均分割成两部分pp.pprint(np.hsplit(a,[2,3]))#沿第二 , 三列 , 分割成三部分'''array([[ 0,1,2,3],[ 4,5,6,7],[ 8,9, 10, 11],[12, 13, 14, 15]])分割成两部分[array([[ 0,1],[ 4,5],[ 8,9],[12, 13]]), array([[ 2,3],[ 6,7],[10, 11],[14, 15]])]分割成三部分[array([[ 0,1],[ 4,5],[ 8,9],[12, 13]]), array([[ 2],[ 6],[10],[14]]), array([[ 3],[ 7],[11],[15]])]'''
1.2split函数函数格式:split(ary, indices_or_sections, axis=0)
第一个参数:数组 。
第二个参数:整数或列表 , 可选参数 。
第三个参数:轴 , 可选参数 。
a=np.arange(24).reshape(4,6)print(a)pp.pprint(np.split(a,[2],axis=0))'''[[ 012345] [ 6789 10 11] [12 13 14 15 16 17] [18 19 20 21 22 23]][array([[ 0,1,2,3,4,5],[ 6,7,8,9, 10, 11]]), array([[12, 13, 14, 15, 16, 17],[18, 19, 20, 21, 22, 23]])]'''
上面这个例子里 , 我们选择了第一条轴 , 也就是列方向 。然后找到第二行一分为二 。
a=np.arange(24).reshape(2,3,4)print(a)pp.pprint(np.split(a,[1],axis=0))#沿第一条轴 , 高pp.pprint(np.split(a,[1],axis=1))#沿第二条轴 , 宽pp.pprint(np.split(a,[1],axis=2))#沿第三条轴 , 长'''[[[ 0123][ 4567][ 89 10 11]] [[12 13 14 15][16 17 18 19][20 21 22 23]]][array([[[ 0,1,2,3],[ 4,5,6,7],[ 8,9, 10, 11]]]), array([[[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]]])][array([[[ 0,1,2,3]],[[12, 13, 14, 15]]]), array([[[ 4,5,6,7],[ 8,9, 10, 11]],[[16, 17, 18, 19],[20, 21, 22, 23]]])][array([[[ 0],[ 4],[ 8]],[[12],[16],[20]]]), array([[[ 1,2,3],[ 5,6,7],[ 9, 10, 11]],[[13, 14, 15],[17, 18, 19],[21, 22, 23]]])]'''
上面是一个三维数组切割的例子 。
2.垂直分割vsplit函数和split函数

推荐阅读