数组的Axis

写在前面
因为对axis的不太了解,给阅读各种代码时带来了各种困扰,因此下定决心决定解决此问题。

根据定义,维度的轴号是数组形状中该维度的索引。 它也是在索引时用于访问该维度的位置。

axis的值是按shape来的,shape=(2,2)时,axis的值有0,1,shape=(3,3,3)时,axis的值有0,1,2,

二维

假设有一个二维数组[[1,2],[3,4]]

In [1]: import numpy as np
#先上一个二维数组
In [3]: x=np.array([[1,2],[3,4]])

In [4]: x
Out[4]:
array([[1, 2],
       [3, 4]])

In [5]: x.shape
Out[5]: (2, 2)
#可以想象成把数组向下压缩(沿着列的方向),取元素之和,4=1+3,6=2+4
In [6]: x.sum(axis=0)
Out[6]: array([4, 6])
#可以想象成把数组向右压缩(沿着行的方向),取元素之和,3=1+2,7=3+4
In [7]: x.sum(axis=1)
Out[7]: array([3, 7])

三维

假设有一个三维数组


In [8]: y=np.array([[[ 0,  1,  2],
   ...:     [ 3,  4,  5],
   ...:     [ 6,  7,  8]],
   ...:    [[ 9, 10, 11],
   ...:     [12, 13, 14],
   ...:     [15, 16, 17]],
   ...:    [[18, 19, 20],
   ...:     [21, 22, 23],
   ...:     [24, 25, 26]]])

In [9]: print y
[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]]

 [[ 9 10 11]
  [12 13 14]
  [15 16 17]]

 [[18 19 20]
  [21 22 23]
  [24 25 26]]]
#沿着axis=0,求和
In [10]: y.sum(axis=0)
Out[10]:
array([[27, 30, 33],
       [36, 39, 42],
       [45, 48, 51]])

嗯,图很丑,将就一下,不知道要用什么绘图软件

axis=0,求和

y.sum(axis=0)就相当于把一个3*3*3的立方体向着蓝色的面压缩,变成一个3*3的数组,对应位置的元素求和,再按顺序排列。

#同理,axis=1相当于向着红色的面压缩,变成一个3*3的数组,对应位置的元素求和,再按顺序排列。
In [11]: y.sum(axis=1)
Out[11]:
array([[ 9, 12, 15],
       [36, 39, 42],
       [63, 66, 69]])
#同理,axis=2相当于向着黄色的面压缩,变成一个3*3的数组,对应位置的元素求和,再按顺序排列。
In [12]: y.sum(axis=2)
Out[12]:
array([[ 3, 12, 21],
       [30, 39, 48],
       [57, 66, 75]])

接下来就是四维了

偷个小懒,来个最简单的吧


In [10]: x=np.array([
    ...: [
    ...:     [[1,2],
    ...:     [3,4]]
    ...: ],
    ...: [
    ...:     [[5,6],
    ...:     [7,8]]
    ...: ]
    ...:
    ...: ])

In [11]: x
Out[11]:
array([[[[1, 2],
         [3, 4]]],


       [[[5, 6],
         [7, 8]]]])
In [12]: x.shape
Out[12]: (2, 1, 2, 2)

怎么理解呢,画出四维,臣妾实在是做不到呀^ _ ^,粗暴一点理解为两个三维的杂交,交。。也就是两个1*2*2的立方体叠加吧,再上一张丑图:

憋笑
In [13]: x.sum(0)
Out[13]:
array([[[ 6,  8],     
        [10, 12]]])
#压缩后是三维哦,axis=0时对应的是shape[0]
In [14]: x.sum(0).shape
Out[14]: (1, 2, 2)
#之后又可以看做是退化了,每一个二维的数组对应一个立方体的操作
In [15]: x.sum(1)  #向着蓝面(channel方向),shape[1]
Out[15]:
array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])

In [16]: x.sum(2)  #向着红面(column方向),shape[2]
Out[16]:
array([[[ 4,  6]],

       [[12, 14]]])

In [17]: x.sum(3)  #向着黄面方向(row方向),shape[3]
Out[17]:
array([[[ 3,  7]],

       [[11, 15]]])

四维的axis=0好像还是有点烧脑,就相当于在保持立方体的形状时,各个立方体超时空融合吧,具体的就脑补吧。

#再来一个例子吧,2个2*1*1的立方体
In [25]: y=np.array([
    ...: [[[1]],[[2]]],
    ...: [[[3]],[[4]]]
    ...: ])

In [26]: y.shape
Out[26]: (2, 2, 1, 1)

In [27]: y.sum(0)
Out[27]:
array([[[4]],

       [[6]]])

最后吐槽一下自己的丑图,愿推荐一个好用的绘图软件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 先决条件 在阅读这个教程之前,你多少需要知道点python。如果你想从新回忆下,请看看Python Tutoria...
    舒map阅读 7,380评论 1 13
  • NumPy是Python中关于科学计算的一个类库,在这里简单介绍一下。 来源:https://docs.scipy...
    灰太狼_black阅读 4,968评论 0 5
  • 作者按: 其实这篇文章完成主体部分是在去年年底,为了使文章更加严谨,同时打算绘制一些配图,所以一直没有发布,之后忙...
    六合外阅读 13,273评论 5 33
  • 微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,本篇随笔介绍微信小程序结合后台数据...
    伍华聪_开发框架阅读 6,293评论 0 50
  • 三十岁的人了,应该长点记性了,不爱了就是不爱了,奢求什么呢,每天相安无事就很好了,能过一天算一天呗
    我是安妮妈咪阅读 1,410评论 0 0