numpy.rollaxis函数解析
大家好,我是公来福,有问题烦请大家email我,共同探讨,我的email是gongqianyun_nk@163.com
numpy轴(axis)、秩(rank)的概念
在研究rollaxis函数之前,我们需要知道numpy中关于轴的概念。
秩(rank):numpy中数组的维数称为秩,一维数组的秩为1,二维数组的秩为2,以此类推。
轴(axis):一直没想到怎样更好地描述轴的概念,参考了https://blog.csdn.net/ddwoys/article/details/80731977这篇博客中关于轴的介绍,简要介绍一下轴的概念。
我认为,numpy中的轴可以想象成平面坐标系中的轴,每个点在x轴和y轴上均有一个值,只有x轴和y轴上的值同时确定才能确定这个点的位置。同样的,在numpy中,只有每个轴上的值都确定了,才能确定究竟是数组中的哪一个元素。一个萝卜一个坑,只有轴上的值都确定了,我们才能知道这个萝卜到底要放到哪个坑里。
ok,下面以一个2*2*3的array为例,可以表示成下面这个样子,怎么样,是不是一目了然,真得不得不说将轴想成树的想法太赞了
numpy.rollaxis解析
官方给出的解释是这样的:
rollaxis(a, axis, start=0)
向后滚动指定的轴,知道它位于给定的位置
参数含义:
a:输入数组
axis:int型,向后滚动的轴,其他轴的位置没有相对于彼此改变
start:int型,可选,滚动轴直到它位于此位置之前
不多说,上代码:
import numpy as np
a = np.ones((3,4,5,6))
print(a.shape)
print(np.rollaxis(a,3,1).shape)
print(np.rollaxis(a,2).shape)
print(np.rollaxis(a,1,4).shape)
打印结果如下:
(3, 4, 5, 6)
(3, 6, 4, 5)
(5, 3, 4, 6)
(3, 5, 6, 4)
列表来表示一下吧,第一行表示轴,第二行表示对应的轴里有几个元素。
初始:
axis | 0 | 1 | 2 | 3 |
---|---|---|---|---|
shape | 3 | 4 | 5 | 6 |
执行代码
np.rollaxis(a,3,1)
对照参数定义可以看出是将3轴放在1轴前面,其他轴相对位置保持不变,所以变化后的轴的位置如下表:
axis | 0 | 3 | 1 | 2 |
---|---|---|---|---|
shape | 3 | 6 | 4 | 5 |
之后,执行代码
np.rollaxis(a,2)
start参数默认为0,所以是将2轴放在0轴前面,其他轴相对位置保持不变,所以变化后轴的位置如下表:
axis | 2 | 0 | 1 | 3 |
---|---|---|---|---|
shape | 5 | 3 | 4 | 6 |
同理,代码
np.rollaxis(a, 1, 4)
执行后是将1轴放在最后面,执行后轴的位置如下表:
axis | 0 | 2 | 3 | 1 |
---|---|---|---|---|
shape | 3 | 5 | 6 | 4 |
现在应该大体了解所谓的轴的滚动是什么意思了,那么轴滚动后里面元素的位置又会发生怎样的变化呢?
import numpy as np
a = np.arange(12).reshape(2,2,3)
print(a)
print(">>>>>>>>>>>>>>>")
print(np.rollaxis(a,2))
打印结果:
[[[ 0 1 2]
[ 3 4 5]]
[[ 6 7 8]
[ 9 10 11]]]
[[[ 0 3]
[ 6 9]]
[[ 1 4]
[ 7 10]]
[[ 2 5]
[ 8 11]]]
为什么会发生这样的情况,我觉得可以这样理解:
我们取一个三位数xyz,其中x表示0轴取值,y表示1轴取值,z表示2轴取值
原先数组可以表示成以下形式:
0(000) | 1(001) | 2(002) |
---|---|---|
3(010) | 4(011) | 5(012) |
6(100) | 7(101) | 8(102) |
9(110) | 10(111) | 11(112) |
执行代码后,轴的顺序变为2、0、1,也就是按照zxy的数字由小到大的顺序排列,即
0,3,6,9,1,4,7,10,2,5,8,11