在研究numpy的时候发现数组是一个很抽象的概念,毕竟远离数学多年,其转置和换轴更是不知所谓了。所以花了一些时间通过画图搞清楚了一些东西。
数组在三维空间的表示方法
两轴数组
arr2 = numpy.arange(8).reshape(2, 4)
#结果
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
在坐标轴上表示应该为:
如果用transpose转置 或者用swapaxes换轴
arr2.transpose((1, 0))
arr2.swapaxes(1, 0)
#结果 array([[0, 4],
[1, 5],
[2, 6],
[3, 7]])
坐标中表示为
实质为将原0轴方向的每组数据,变换成横轴表示,也就是说横纵轴进行了互换。如果不太理解可以看轴箭头方向的数值个数。例如:右图中的0轴沿着箭头方向仍然是4个数值,即为原来的左图的1轴。或者你可以自己画一下转换一下查看的方向,一目了然。
这里要说明一下transpose和swapaxes参数不同,transpose要将所有的轴都列出来,哪两个轴互换就把轴索引换一下,
例如:三维数组里0,1轴互换或者0,2轴互换应该写成:
transpose((1,0,2))
transpose((2,1,0))
如果用swapaxes应该写成:
swapaxes(1,0)
swapaxes(2,0)
三轴数组
那么如果是三轴的数组又该怎么理解呢
arr1 = arr1.reshape(2, 2, 4)
#结果
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
arr1.ndim#轴数
#结果3
画图表示为
这里的轴的编号已经通过程序测试过,通过图中可以看到,是两个两轴的数组通过0轴建立了关系,在这张图中0轴是固定轴,即只有一个0轴,1,2轴可以有多个,也就是说如果再有1维数据或者多维,只需要在0轴上再多画上1,2轴在平面上写上数组的数值就可以了。
接下来就要进行转置和换轴操作了,
我们先从简单的来
1 2轴的互换,这个很好理解,1,2轴在一个平面,如果互换跟上面的两轴数组是一个道理。
arr1.transpose((0, 2 ,1))
#或者
arr1.swapaxes(2,1)
#结果
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])
是不是跟两轴的数组一样呢?因为1,2轴在同一个平面,只需要各回各家各找各妈自己的1,跟自己的2 换就可以了。
下面就稍微一丢丢的需要理解了,当然我能明白的,你们肯定能,因为我笨,而且,还是文科生。
这回咱们来换0 和1轴
还记得上面说的固定轴吗,0原本是固定轴,1轴和2轴都是可以有多个的,我们叫他活动轴。现在互换也就是让1变成固定轴,0变成和2一样的活动轴。即转置或换轴后,原1轴只有一个,原0和2可以有多个轴。
arr1.transpose((1, 0 ,2))
或者
arr1.swapaxes(1,0)
#结果
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
这张图我用原数组在图中的结构做了辅助线作为解释,轴号都是原数组的轴号,
红虚线标出的1号轴可当不存在,0号轴变成了活动轴可以有多个,所以2号轴要配合0号轴做一条新的2号轴(2号轴也可以有多个不违反规则),这样就组成了上下两个平面,每个平面上的数值就是数组的结果。
下面我们再来转置或换轴一下0和2号轴
arr1.transpose((2, 1, 0))
或者
arr1.swapaxes(2, 0)
#结果
array([[[ 0, 8],
[ 4, 12]],
[[ 1, 9],
[ 5, 13]],
[[ 2, 10],
[ 6, 14]],
[[ 3, 11],
[ 7, 15]]])
这里还是用原数组图来说明问题,这个大家对电脑都很熟悉,机箱里你的交火显卡不就是这么排列的咩,每个平面上的4个数值就成了一组。2轴成为了固定轴,1和0轴成为了活动轴,可以有多个。
因此,如果跟0轴进行转置和换轴,实质为固定轴和活动轴的交换,而,1和2轴的转置和换轴,其实为两轴数组的交换。
图画的很烂,望见谅,如果有任何错误,请指正,不胜感激。