转载
目录
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
仍然使用上面三通道图像的例子。分别计算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),因为删除了最外层 []。
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。
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。