2021-07-17 Python笔记 如何理解Numpy数组中的axis?

Python笔记 如何理解Numpy数组中的axis?


博主对axis的理解可能也不够深入,暂时只是一些实践后的简单总结,如果有描述错误,也请指正!

下面就简单讲讲我的思路吧

首先,我并不打算很执着地像大部分朋友一样非常强烈地想要搞清楚axis=0或axis=1与横、纵坐标的直接关系,因为我觉得这样的理解在数组维度较低的时候还可以适用,但是数组维度一高,就又会有经常混淆的情况出现。

我的想法还是更倾向于数形结合去理解

首先,axis的可能取值显然与数组的维度相关 [ 0 , d i m m a x − 1 ] [0, dim_{max} - 1] [0,dimmax1],我们下面就分别用一、二、三维度的数组来举例说明,帮助理解。

  • 一维:
import numpy as np

x = np.array([1, 2, 3])
print(x.sum(0))
>>>6

一维的数组axis的取值显然只可能是0,代表的维度也不用多讲,易得 s u m = 6 sum = 6 sum=6

  • 二维:
import numpy as np

x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(x.sum(0))
print(x.sum(1))
>>>[12 15 18]
>>>[6 15 24]

二维的数组axis的取值可能为0或1
x . s u m ( 0 ) = [ 12   15   18 ] x.sum(0) = [12\ 15\ 18] x.sum(0)=[12 15 18],其中 12 = 1 + 4 + 7 ; 15 = 2 + 5 + 8 ; 18 = 3 + 6 + 9 12 = 1 + 4 + 7;15 = 2 + 5 + 8;18 = 3 + 6 + 9 12=1+4+7;15=2+5+8;18=3+6+9
x . s u m ( 1 ) = [ 6   15   24 ] x.sum(1) = [6\ 15\ 24] x.sum(1)=[6 15 24],其中 6 = 1 + 2 + 3 ; 15 = 4 + 5 + 6 ; 24 = 7 + 8 + 9 6 = 1 + 2 + 3;15 = 4 + 5 + 6;24 = 7 + 8 + 9 6=1+2+3;15=4+5+6;24=7+8+9

在这里插入图片描述

我们将这张图片与上面的两条式子对照一下,我们可以发现 x . s u m ( 0 ) x.sum(0) x.sum(0)计算的是每一行的 s u m sum sum,而 x . s u m ( 1 ) x.sum(1) x.sum(1)计算的是每一列的 s u m sum sum

我们还可以从另一个所谓“内层与外层”的角度看待这个问题,通过观察本例中数组的初始化语句 x = n p . a r r a y ( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] , [ 7 , 8 , 9 ] ] ) x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) x=np.array([[1,2,3],[4,5,6],[7,8,9]])可以发现符号"[ ]"存在一个内层外层的关系,所以其实我们可以把 a x i s = ? axis = ? axis=? 理解为内层或者外层的概念。
a x i s = 0 axis = 0 axis=0 时, x . s u m ( 0 ) = [ 12   15   18 ] x.sum(0) = [12\ 15\ 18] x.sum(0)=[12 15 18],相当于是把数组的外层 [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] , [ 7 , 8 , 9 ] [1, 2, 3], [4, 5, 6], [7, 8, 9] [1,2,3],[4,5,6],[7,8,9]进行相加得到 [ 12   15   18 ] [12\ 15\ 18] [12 15 18](位级相加)。
a x i s = 1 axis = 1 axis=1 时, x . s u m ( 1 ) = [ 6   15   24 ] x.sum(1) = [6\ 15\ 24] x.sum(1)=[6 15 24],相当于是把数组的内层分别相加, [ 1 , 2 , 3 ] [1, 2, 3] [1,2,3]相加得到 6 6 6, [ 4 , 5 , 6 [4, 5, 6 [4,5,6]相加得到 15 15 15 [ 7 , 8 , 9 ] [7, 8, 9] [7,8,9]相加得到 24 24 24,最终得到 [ 6   15   24 ] [6\ 15\ 24] [6 15 24]

所谓的内层、外层其实就是一层层的把最外层的[ ]符号给拆掉得到的, [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] , [ 7 , 8 , 9 ] ] [[1, 2, 3], [4, 5, 6], [7, 8, 9]] [[1,2,3],[4,5,6],[7,8,9]])拆掉最外层的[ ]得到 [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] , [ 7 , 8 , 9 ] [1, 2, 3], [4, 5, 6], [7, 8, 9] [1,2,3],[4,5,6],[7,8,9],把 [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] , [ 7 , 8 , 9 ] [1, 2, 3], [4, 5, 6], [7, 8, 9] [1,2,3],[4,5,6],[7,8,9]的[ ]拆掉,分别得到三组数字 1   2   3 1\ 2\ 3 1 2 3 4   5   6 4\ 5\ 6 4 5 6 7   8   9 7\ 8\ 9 7 8 9

  • 三维:
import numpy as np

x = np.array([[[1, 2, 3]], [[4, 5, 6]], [[7, 8, 9]]])
print(x.sum(0))
print(x.sum(1))
print(x.sum(2))
>>>[[12 15 18]]
>>>[[1 2 3]
 	[4 5 6]
 	[7 8 9]]
>>>[[ 6]
 	[15]
 	[24]]

我们同样是从两个角度来看
首先,数形结合
在这里插入图片描述
我们可以发现 x . s u m ( 0 ) x.sum(0) x.sum(0)计算的是沿着x轴方向的 s u m sum sum x . s u m ( 1 ) x.sum(1) x.sum(1)计算的是沿着y轴方向的 s u m sum sum x . s u m ( 2 ) x.sum(2) x.sum(2)计算的是沿着z轴方向的 s u m sum sum

然后,从“内层与外层”的角度看待这个问题 x = n p . a r r a y ( [ [ [ 1 , 2 , 3 ] ] , [ [ 4 , 5 , 6 ] ] , [ [ 7 , 8 , 9 ] ] ] ) x = np.array([[[1, 2, 3]], [[4, 5, 6]], [[7, 8, 9]]]) x=np.array([[[1,2,3]],[[4,5,6]],[[7,8,9]]])

a x i s = 0 axis = 0 axis=0 时, x . s u m ( 0 ) = [ [ 12   15   18 ] ] x.sum(0) = [[12\ 15\ 18]] x.sum(0)=[[12 15 18]],相当于是把数组的外层 [ [ 1 , 2 , 3 ] ] , [ [ 4 , 5 , 6 ] ] , [ [ 7 , 8 , 9 ] ] [[1, 2, 3]], [[4, 5, 6]], [[7, 8, 9]] [[1,2,3]],[[4,5,6]],[[7,8,9]]进行相加得到 [ [ 12   15   18 ] ] [[12\ 15\ 18]] [[12 15 18]]
a x i s = 1 axis = 1 axis=1 时, x . s u m ( 1 ) = [ [ 123 ] [ 456 ] [ 789 ] ] x.sum(1) = [[1 2 3][4 5 6][7 8 9]] x.sum(1)=[[123][456][789]],相当于是把数组的次外层 [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] , [ 7 , 8 , 9 ] [1, 2, 3], [4, 5, 6], [7, 8, 9] [1,2,3],[4,5,6],[7,8,9]进行拼接(是拼接而不是相加,是因为它们原本不存在于同一个[ ]中,在二维的例子中是数值相加是因为它们原本是从同一个[ ]中拆分出来的),得到 [ [ 123 ] [ 456 ] [ 789 ] ] [[1 2 3][4 5 6][7 8 9]] [[123][456][789]]
a x i s = 2 axis = 2 axis=2 时, x . s u m ( 2 ) = [ [ 6 ] [ 15 ] [ 24 ] ] x.sum(2) = [[ 6][15][24]] x.sum(2)=[[6][15][24]],相当于是把数组的内层 1 , 2 , 3 1, 2, 3 1,2,3 4 , 5 , 6 4, 5, 6 4,5,6 7 , 8 , 9 7, 8, 9 7,8,9 进行分别相加得到 [ [ 6 ] [ 15 ] [ 24 ] ] [[ 6][15][24]] [[6][15][24]]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值