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

本文主要介绍了Numpy数组的组合与分割实现的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Numpy数组的组合与分割实现的方法,久久派带你了解更多相关信息。

目录
  • 数组的组合
    • 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]]])]\'\'\'

      到此这篇关于Numpy数组的组合与分割实现的方法的文章就介绍到这了,更多相关Numpy数组组合与分割内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

      版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/13249.html

      (0)
      nan
      上一篇 2021-08-16
      下一篇 2021-08-16

      相关推荐

      • iqoo8Pro个人热点怎么打开?iqoo8Pro手机热点打开方法

        这篇文章主要介绍了iqoo8Pro个人热点怎么打开?iqoo8Pro手机热点打开方法的相关资料,当大家一起出去玩的时候,自己的朋友没有流量可以开启热点,和她一起共享自己网络,下面小编就将解下iqoo8Pro个人热点打开方式,其实很简单的,看

        2021-08-26 热点头条
        0
      • 车险换保险公司有什么影响?(带来影响大吗)

        我们的汽车买回来需要购买上一份车险,车险需要一年购买一次,车险到期之后可以选择其他保险公司,特别是第一次买车的

        2021-08-27
        0
      • 鼓舞士气的文章口号(鼓舞士气振奋人心的话)

        人生是对理想的追求,理想是人生的指示灯,失去了这灯的作用,就会失去生活的勇气,因此只有坚持远大的人生理想,才不会在生活的海洋中迷失方向。鼓舞士气的文章11、阻止你前行的,不是人生道路上的一百块石头,而是你鞋子里的那一颗石子。2、如果骄傲没有被现实的大

        2021-12-31
        0
      • 麒麟990和骁龙865哪个好(这两款手机你如何选择)

        目前,华为手机的销量是比较不错的,尤其是麒麟990处理器的加成,它的好处就是信号稳定速度快,目前还没有哪一款手机敢跟麒麟990的稳定性叫板的。而骁龙865也是目前高通最强悍的处理器了,那么它们到底谁更优秀呢?接下来小编就拿两款手机给大家做一下对比。

        2021-12-31 热点头条
        0
      • 苹果x用的什么处理器(苹果x相当于什么价位安卓手机)

        摘要:性能方面,iPhoneX搭载苹果A11处理器,这是当年智能手机中性能最强的处理器芯片,即使是在4年之后,它的理论性能依旧可以和海思麒麟985高通骁龙768G联发科天玑820等芯片打个平手,战斗力不可小觑。

        2023-04-10
        0
      • 男子隔空猥亵女童被判6年 !已构成猥亵儿童罪 !

        近日,湖北随州。曾都区法院审理一起猥亵儿童罪案件。经查明,2021年9月,毛某与未满14岁的周某某通过网游平台结识添加为QQ好友,毛某以交换隐私部位照片等为由,多次诱哄周某某拍摄隐私部位照片供其观看。因要求连视频互看身体遭拒,毛某以存有其隐私部位照片要挟,胁迫周某某继续拍摄隐私部位照片,周母发现后报

        热点头条 2023-04-25
        0

      发表回复

      登录后才能评论