NumPy数组维度axis参数理解

本文详细解析了Python中NumPy库的axis参数在数组计算中的作用。通过实例介绍了如何创建不同维度的数组,并解释了axis=0、1、2时的计算原理,包括在每个维度上进行统计的操作方式,以及keep_dims参数对保持维度的影响。
摘要由CSDN通过智能技术生成

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、设置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,对应的是 [],这一层下面有三个 []子块,直接在对应位置上相加,得到右边的结果,最外层 []我用了虚线表示,当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。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GHZhao_GIS_RS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值