Python笔记 如何理解Numpy数组中的axis?
博主对axis的理解可能也不够深入,暂时只是一些实践后的简单总结,如果有描述错误,也请指正!
下面就简单讲讲我的思路吧
首先,我并不打算很执着地像大部分朋友一样非常强烈地想要搞清楚axis=0或axis=1与横、纵坐标的直接关系,因为我觉得这样的理解在数组维度较低的时候还可以适用,但是数组维度一高,就又会有经常混淆的情况出现。
我的想法还是更倾向于数形结合去理解
首先,axis的可能取值显然与数组的维度相关 [ 0 , d i m m a x − 1 ] [0, dim_{max} - 1] [0,dimmax−1],我们下面就分别用一、二、三维度的数组来举例说明,帮助理解。
- 一维:
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]]。