作者:NathanHuXy
更新日期:2022.8.9
Numpy最困难也是最重要的概念就是轴Axis。往往新手很难理解什么是轴,以及如何使用它。本文将对其进行介绍。
新手往往将轴理解成“横向”和“纵向”,或者“行”和“列”。事实上,这样的理解并不完备,主要有两方面的严重缺陷:
因此,有必要明确——轴Axis不可以理解成”横向“或者”纵向“
类比二维平面,我们常说二维平面有两个轴,分别为X轴和Y轴。对于平面上的任何一个点,都可以用一个二维向量表示。例如,为了表示原点,使用$(0,0)$进行表示。类似地,为了选取np.array中的一个元素,需要使用列表作为索引,由外向内地进行选取,直到最后一层。
import numpy as np
data = np.array([[1,2,3,4],[5,6,7,8]])
print("Out: {}".formt(data[1,2]))
# OUT: 7
在上面的例子中,索引为[1,2]。其中,第0轴为1,第1轴为2(从0开始编码),由于data只有2个维度,因此最多可以为2个轴赋值。
因此,我们给出轴的定义:当选取array中的元素是,从左到右的每个位置分别是第0轴,第1轴,以此类推。且轴数不超过其维度(.ndim)。
在函数中经常使用关键字参数,如axis=0、axis=1。问题是,当我们向函数传入这一关键字参数,我们实际上传入了什么?
这一关键字表示函数作用的方向,其是沿着这一轴的坐标变化的方向。
例如,对于一个含有2个轴的数据data:
| $data(0,0)$ | $data(0,1)$ |
|---|---|
| $data(1,0)$ | $data(1,1)$ |
axis=0表示第一个轴变化的方向即从上到下,axis=1表示第二个轴变化的方向即从左到右。
再例如,对于一个含有4个轴的数据data,axis=2表示遍历$data_{i,j,k,w}$中的所有$k$的可能取值。下面看一个具体的例子。
首先,生成一个含有4个轴的数据结构:
[In]:
import numpy as np
array = np.random.randint(0, 3, [3,2,4,5])
print(array)
[Out]:
[[[[1 0 0 2 1]
[2 0 0 0 1]
[2 0 1 2 2]
[1 2 0 2 2]]
[[2 2 0 1 0]
[0 1 0 1 1]
[2 2 1 0 1]
[1 1 1 0 1]]]
[[[1 1 2 1 2]
[0 1 1 1 1]
[1 0 1 0 2]
[0 2 1 0 2]]
[[1 1 2 2 1]
[0 0 2 1 0]
[1 2 2 0 2]
[1 1 2 2 0]]]
[[[1 0 2 2 2]
[0 1 1 1 0]
[2 2 2 0 0]
[0 0 0 0 0]]
[[2 2 1 1 2]
[2 2 0 2 0]
[0 0 1 1 2]
[0 1 2 2 1]]]]
我们对变量array调用np.sum()函数,并且传入关键字参数axis=2,得到了:
[In]:
print(np.sum(array,axis=2))
[Out]:
[[[6 2 1 6 6]
[5 6 2 2 3]]
[[2 4 5 2 7]
[3 4 8 5 3]]
[[3 3 5 3 2]
[4 5 4 6 5]]]
成功了!
不出意外地,我们对原来结构为$[3,2,4,5]$再第2轴上调用了求和函数,得到的新的数据的结构为$[3,2,5]$。你可以理解成第2轴“坍塌”成了只需要1个数字就可以确定的了,那么也没必要对其所在的轴进行保留了。我们的数据从4维变成了3维。
2 commits
Python
100.0%
作者:NathanHuXy
更新日期:2022.8.9
Numpy最困难也是最重要的概念就是轴Axis。往往新手很难理解什么是轴,以及如何使用它。本文将对其进行介绍。
新手往往将轴理解成“横向”和“纵向”,或者“行”和“列”。事实上,这样的理解并不完备,主要有两方面的严重缺陷:
因此,有必要明确——轴Axis不可以理解成”横向“或者”纵向“
类比二维平面,我们常说二维平面有两个轴,分别为X轴和Y轴。对于平面上的任何一个点,都可以用一个二维向量表示。例如,为了表示原点,使用$(0,0)$进行表示。类似地,为了选取np.array中的一个元素,需要使用列表作为索引,由外向内地进行选取,直到最后一层。
import numpy as np
data = np.array([[1,2,3,4],[5,6,7,8]])
print("Out: {}".formt(data[1,2]))
# OUT: 7
在上面的例子中,索引为[1,2]。其中,第0轴为1,第1轴为2(从0开始编码),由于data只有2个维度,因此最多可以为2个轴赋值。
因此,我们给出轴的定义:当选取array中的元素是,从左到右的每个位置分别是第0轴,第1轴,以此类推。且轴数不超过其维度(.ndim)。
在函数中经常使用关键字参数,如axis=0、axis=1。问题是,当我们向函数传入这一关键字参数,我们实际上传入了什么?
这一关键字表示函数作用的方向,其是沿着这一轴的坐标变化的方向。
例如,对于一个含有2个轴的数据data:
| $data(0,0)$ | $data(0,1)$ |
|---|---|
| $data(1,0)$ | $data(1,1)$ |
axis=0表示第一个轴变化的方向即从上到下,axis=1表示第二个轴变化的方向即从左到右。
再例如,对于一个含有4个轴的数据data,axis=2表示遍历$data_{i,j,k,w}$中的所有$k$的可能取值。下面看一个具体的例子。
首先,生成一个含有4个轴的数据结构:
[In]:
import numpy as np
array = np.random.randint(0, 3, [3,2,4,5])
print(array)
[Out]:
[[[[1 0 0 2 1]
[2 0 0 0 1]
[2 0 1 2 2]
[1 2 0 2 2]]
[[2 2 0 1 0]
[0 1 0 1 1]
[2 2 1 0 1]
[1 1 1 0 1]]]
[[[1 1 2 1 2]
[0 1 1 1 1]
[1 0 1 0 2]
[0 2 1 0 2]]
[[1 1 2 2 1]
[0 0 2 1 0]
[1 2 2 0 2]
[1 1 2 2 0]]]
[[[1 0 2 2 2]
[0 1 1 1 0]
[2 2 2 0 0]
[0 0 0 0 0]]
[[2 2 1 1 2]
[2 2 0 2 0]
[0 0 1 1 2]
[0 1 2 2 1]]]]
我们对变量array调用np.sum()函数,并且传入关键字参数axis=2,得到了:
[In]:
print(np.sum(array,axis=2))
[Out]:
[[[6 2 1 6 6]
[5 6 2 2 3]]
[[2 4 5 2 7]
[3 4 8 5 3]]
[[3 3 5 3 2]
[4 5 4 6 5]]]
成功了!
不出意外地,我们对原来结构为$[3,2,4,5]$再第2轴上调用了求和函数,得到的新的数据的结构为$[3,2,5]$。你可以理解成第2轴“坍塌”成了只需要1个数字就可以确定的了,那么也没必要对其所在的轴进行保留了。我们的数据从4维变成了3维。
2 commits
Python
100.0%