python中的numpy是很高效的矩阵计算库,做图像处理经常会用到,但是对其中的axis参数理解的不是很清楚,每次遇到高维度的数据计算时,老是尝试好多次才会用对axis参数,很是浪费时间,这次从底层原理分析一下numpy库的axis参数的使用方法。
1、numpy库创建数组
import numpy as np
#一维
one_dims=np.array([1,2,3])
print(one_dims.shape)
一维的情况非常简单,这里就不再多说。
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波段的图像数据。
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)
总结:使用numpy创建数组时,每增加一个[]表示增加一个维度,一个[]可以看成一个完整的块,这点对下一步分维度计算时的理解很重要。每层[]下有几块,shape对应的值就为几。
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)
输出结果
下面使用图像来还原一下计算过程。
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)
计算结果
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)
计算结果
总结:
1、numpy的数组中,每一层[]对应一个维度。
2、使用axis统计时,表示在第axis层下进行统计,统计的单位为当前级别的子块,按子块进行运算。
3、默认keep_dims=False,numpy计算后会删除对应axis层,因为该维度元素个数计算后始终为1,要想保持计算前后维度一致,需要设置keep_dims的值为True。