您当前的位置: 首页 >  Python

静静喜欢大白

暂无认证

  • 2浏览

    0关注

    521博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Python-图解矩阵维度axis参数+求和举例

静静喜欢大白 发布时间:2021-03-01 14:11:09 ,浏览量:2

转载

目录

1、numpy库创建数组

2、设置axis时的计算原理。

2.1、axis=0。

2.2、axis=1

2.3、axis=2

总结

python中的numpy是很高效的矩阵计算库,做图像处理经常会用到,但是对其中的axis参数理解的不是很清楚,每次遇到高维度的数据计算时,老是尝试好多次才会用对axis参数,很是浪费时间,这次从底层原理分析一下numpy库的axis参数的使用方法。

1、numpy库创建数组
import numpy as np
#一维
one_dims=np.array([1,2,3])
print(one_dims.shape)

一维的情况非常简单,这里就不再多说。

假设上图是一个单波段图像的灰度图,用numpy数据表示就是

a=np.array([[1,100,55],[79,22,79],[16,47,21]])
print(a)
print(a.shape)

可以看到输出的shape是(3,3),第一个3对应的是最外层的[],下面有3个子块分别是[1,100,55],[79,22,79],[16,47,21],所以这一层的尺度为3。再看第二层[],如[1,100,55]下面有3个独立的子块,分别为1,100,55,所以这一层的尺度为3。 依次类推我们看看三维的情况,假如下面是一个3波段的图像数据。

用numpy表示如下

a=np.array([[[1,100],[79,22],[16,195],[189,56]],
[[32,4],[21,88],[57,250],[18,93]],
[[246,18],[75,37],[45,247],[6,47]]])
print(a)
print(a.shape)

输出的结果为3通道,4行,2列。

结合上图

  • 最外层为 [],内部有三个 [],所以shape的第一位为3
  • 第二层为 [],每个 []内部有4个 [],所以shape的第二位为4
  • 第三层为 [],每个 []中有2个元素,所以shape的第三位为2。
  • 总结:使用numpy创建数组时,每增加一个[]表示增加一个维度,一个[]可以看成一个完整的块,这点对下一步分维度计算(计算的时候按照对应的位置进行求和等操作)时的理解很重要。每层[]下有几块,shape对应的值就为几。
  • 发现这里看,也可以,最外层[]里面有2个逗号,因此第一维是2+1=3;次外层[]里面有3个逗号,因此第二维度是3+1=4,最里面层[]有1个逗号,因此第三维度就是1+1=2
2、设置axis时的计算原理。

仍然使用上面三通道图像的例子。分别计算axis=0,1,2的sum值

再来回顾一下上面说的使用numpy创建数组时,每增加一个[]表示增加一个维度,一个[]可以看成一个完整的块。 使用axis参数时,就是计算对应[]下的子块。计算完后删除对应层的[],维度会少一层,想要不删除[],可以使用keep_dims=True参数,我们分别测试一下。

2.1、axis=0。
a=np.array([[[1,100],[79,22],[16,195],[189,56]],
[[32,4],[21,88],[57,250],[18,93]],
[[246,18],[75,37],[45,247],[6,47]]])

sum_axis0=np.sum(a,axis=0)
print("axis=0:")
print(sum_axis0,"\n")
print(sum_axis0.shape)

sum_axis0_keep=np.sum(a,axis=0,keepdims=True)
print("axis=0,keep_dims=true:")
print(sum_axis0_keep)
print(sum_axis0_keep.shape)

输出结果

可以看到,使用keep_dims=True之后,会保留对应层的维度。

下面使用图像来还原一下计算过程。

axis=0,对应的是 [],在我们的例子中有1个[],因此在下一层的子块对应位置中直接计算。下一层下面有三个 []子块,直接在对应[]块对应位置上相加,得到右边的结果

  • 结果的最外层 []我用了虚线表示,当keep_dims=True的时候才存在,有1个 [],所以shape的第一位为1
  • 第二层 []都有4个 [],所以shape的第二位为4
  • 第三层 []下有两个元素,所以shape第三位为2。
  • 最终当keep_dims=True时,得到的结果的shape为(1,4,2),当keep_dims=False(默认)时,得到的结果shape为(4,2),因为删除了最外层 []。
2.2、axis=1
a=np.array([[[1,100],[79,22],[16,195],[189,56]],
[[32,4],[21,88],[57,250],[18,93]],
[[246,18],[75,37],[45,247],[6,47]]])

sum_axis1=np.sum(a,axis=1)
print("axis=1:")
print(sum_axis1,"\n")
print(sum_axis1.shape)

sum_axis1_keep=np.sum(a,axis=1,keepdims=True)
print("axis=1,keep_dims=true:")
print(sum_axis1_keep)
print(sum_axis1_keep.shape)

计算结果

当axis=1时,对应 []这一层,我们的例子中有三个 [],分别单独计算

  • 第一个 []下有4个 []子块,把这4个子块对应位置相加:[1,100]+[79,22]+[16,195]+[189,56]=[285,373],其他两个 []下依次类推,得到统计结果。
  • 当keep_dims=False时,删除 []这一层,对应的就是(3,1,2)中的第二位1。
2.3、axis=2
a=np.array([[[1,100],[79,22],[16,195],[189,56]],
[[32,4],[21,88],[57,250],[18,93]],
[[246,18],[75,37],[45,247],[6,47]]])

sum_axis2=np.sum(a,axis=2)
print("axis=2:")
print(sum_axis2,"\n")
print(sum_axis2.shape)

sum_axis2_keep=np.sum(a,axis=2,keepdims=True)
print("axis=2,keep_dims=true:")
print(sum_axis2_keep)
print(sum_axis2_keep.shape)

计算结果

当axis=2时,对应 []这一级,每个 []下有两个元素,直接相加

  • 如第一个 []下为1、100,直接相加为101,其他依次类推。
  • 当keep_dims=False时,删除 [],即shape为(3,4,1)中的1。
总结

1、numpy的数组中,每一层[]对应一个维度。 2、使用axis统计时,表示在第axis层下进行统计,统计的单位为当前级别的子块,按子块对应位置进行运算。 3、默认keep_dims=False,numpy计算后会删除对应axis层,因为该维度元素个数计算后始终为1,要想保持计算前后维度一致,需要设置keep_dims的值为True,保留下来此处位置的size一直都是1。

关注
打赏
1510642601
查看更多评论
立即登录/注册

微信扫码登录

0.3194s