当前位置 博文首页 > Numpy数组的组合与分割实现的方法

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

    作者:zeroy610 时间:2021-09-18 17:47

    目录
    • 数组的组合
      • 1.水平组合
      • 2.垂直组合
      • 3.行组合和列组合
      • 4.深度组合
    • 数组的分割
      • 1.水平分割
        • 1.1hsplit函数
        • 1.2split函数
      • 2.垂直分割
        • 3.深度分割

        在介绍数组的组合和分割前,我们需要先了解数组的维(ndim)和轴(axis)概念。

        如果数组的元素是数组,即数组嵌套数组,我们就称其为多维数组。几层嵌套就称几维。比如形状为(a,b)的二维数组就可以看作两个一维数组,第一个一维数组包含a个一维数组,第二个一维数组包含b个数据。

        每一个一维线性数组称为一个轴。二维数组的第一个轴(axis=0)就是以数组为元素的数组,第二个轴(axis=1)就是数组中的数组。因此第一个轴的方向就是沿着行的方向(垂直方向),第二个轴的方向沿着列的方向(水平方向)。

        我们从嵌套数组的角度来看,a[0],a[1],a[2],a[3]……分别是取二维数组的第一行,二行,三行,四行……这正是先沿着第一个轴取元素(元素为行)。a[0][0],a[0][1]……则是(沿着第二个轴)取第一行的第一个元素,第二个元素……

        也就是说,数组的轴从最外层数起。

        三维数组我们应该怎么理解呢?我们可以把它看作二维数组的堆叠,即一个立方体。它的第一个轴(axis=0)就是以二维数组为元素的数组,它的方向沿着二维数组堆叠的方向,也就是立方体的高。第二个轴自然就是立方体的宽,第三个轴就是立方体的长。举例来说,一个形状为(a,b,c)的三维数组就是a个形状为(b,c)的二维数组嵌套在一起。

        a=np.arange(24).reshape(2,3,4)#建立一个维度为3,形状为(2,3,4)的三维数组
        print(a)#打印
        print(a.sum(axis=0))#沿第一个轴求和
        print(a.sum(axis=1))#沿第二个轴求和
        print(a.sum(axis=2))#沿第三个轴求和
        
        '''
        a的形状如下:
        [[[ 0  1  2  3]
          [ 4  5  6  7]
          [ 8  9 10 11]]
        
         [[12 13 14 15]
          [16 17 18 19]
          [20 21 22 23]]]
         
         沿第一个轴求和:
         [[12 14 16 18]
         [20 22 24 26]
         [28 30 32 34]]
         
         沿第二个轴求和:
         [[12 15 18 21]
         [48 51 54 57]]
         
         沿第三个轴求和:
        [[ 6 22 38]
         [54 70 86]]
        '''

        从这个例子可以看出,沿第一个轴求和,就是从上方把这个立方体“压扁”,第二个轴就是沿着宽,第三个轴就是沿着长。类似投影。

        我们终于明白了,reshape函数的参数顺序不是我们想当然认为的长,宽;长,宽,高;因为你无法解释为什么三维数组变形后的形状与你所想的大相径庭。它的顺序是轴的顺序(第一条轴,第二条轴,第三条轴……),也就是沿这条轴有多少个元素。轴的概念很重要,在很多函数中都有体现。

        再直观一点说,参数顺序应该是高,宽(行方向),长(列方向)。

        所以,数组的维度就很好理解了,就是轴的数量。我们在理解多维数组的时候,不要先入为主地认为多维数组的元素会更多;多维数组只是它嵌套的层数多而已。高维数组也可能不含元素。

        接下来我们介绍数组的组合。

        数组的组合

        数组的组合有水平组合,垂直组合,深度组合等方式。实现这些组合的函数主要有vstack,dstack,hstack,column_stack,row_stack,concatenate等。

        因为我们最常用的数组也不过三维,所以用水平,垂直这样的字眼比较形象;但我们要明白,本质上是沿轴进行的操作。

        数组组合通常不会改变数组的维度。

        1.水平组合

        hstack函数与concatenate函数

        1.1hstack函数:水平连接多个数组。参数只有一个:以数组为元素的序列。

        1.2concatenate函数:沿着现有的轴连接数组序列。

        函数格式:concatenate((a1, a2, ...), axis=0, out=None)

        参数说明:a1, a2, ...:为以数组为元素的类数组序列。其中数组形状必须相同。

                          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))
        
        '''
        
        [[ 0  1  2  3  4  5]
         [ 6  7  8  9 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))#沿第三条轴,长
        
        '''
        
        [[[ 0  1  2  3]
          [ 4  5  6  7]
          [ 8  9 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函数

        沿垂直方向,就是沿行方向,沿第一条轴(axis=0)方向。

        split函数如上,改一条轴参数即可。

        3.深度分割

        dsplit函数

        主要用于三维数组,其实就是沿第三条轴切割,就好比从上方切蛋糕一样。

        a=np.arange(24).reshape(2,3,4)
        b=np.dsplit(a,4)#把这个蛋糕从上切成四份
        pp.pprint(b)
        
        '''
        [array([[[ 0],
                [ 4],
                [ 8]],
        
               [[12],
                [16],
                [20]]]),
         array([[[ 1],
                [ 5],
                [ 9]],
        
               [[13],
                [17],
                [21]]]),
         array([[[ 2],
                [ 6],
                [10]],
        
               [[14],
                [18],
                [22]]]),
         array([[[ 3],
                [ 7],
                [11]],
        
               [[15],
                [19],
                [23]]])]
        
        '''
        jsjbwy
        下一篇:没有了