numpy之高维数组的转置:transpose方法——经过几何体来迅速理解

首先说明,这个方法是博主在理解高维数组转置的transpose 方法时所提出的,所以严谨性和正确性有待考察,但私觉得彻底能够这样理解,所以作个记录,若是对你有帮助的话欢迎点赞收藏,若是认为有错误的话请提出批评,督促改进。数组


transpose方法是数组用来转置的一种方法,尤为对于高维数组,transpose须要获得一个由轴编号组成的元组才能对这些轴进行转置。那么是怎么根据这个轴来完成转置的呢?spa

咱们来看下面这个三维数组:code

arr = np.arange(16).reshape((2, 2, 4))
arr

array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])

arr进行转置:ip

arr.transpose((1, 0, 2))

array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])

以上面这个 2 组 2 行 4 列的三维数组为例,试图经过在笛卡尔坐标系下想象立方体的变换来理解,所以有下面的想法。首先要知道transpose的参数表示 shape 的形状,对于这个例子来讲,即2[0]2[1]4[2],用transpose(1,0,2)转置后变为2[1]2[0]4[2]。这句话看起来颇有道理,但到底是怎么变换的呢?经过这句话仍然不可思议,因此咱们把这个数组放在三维坐标下来看:it

clipboard.png

在这里我假设这个三维数组在空间中按上图的方式排列,数组里每一个数字存放在一个小立方体中,更具体一点,咱们的俯视图以下:class

clipboard.png

有了这个图就好理解了,咱们经过transpose的方法,将数组的排列方式由2[0]2[1]4[2]变为了2[1]2[0]4[2],在坐标系中就是z[0]x[1]y[2]变为了z[1]x[0]y[2],也就是说交换了x轴和z轴!cli

整个过程当中y轴没有参与,因此它们的纵坐标不会改变,为了简便表示,咱们只考虑x轴和z轴。在这里我以小立方体的个数来做为坐标,即把它视为一个点来计算坐标。若是将 4 这个点的坐标在xOz(O为坐标原点)平面内视为(2,1),那么通过transpose后,它的坐标应变为(1,2),同理,和 4 同一行的数字也通过一样的变换。而数字 12 的坐标可视为(2,2),变换后仍为(2,2)方法

再回到上图中看,这时咱们应该就很容易明白transpose这个方法对数组进行了怎样的变换:数组[4,5,6,7]和数组[8,9,10,11]xOz平面内横纵坐标互换,所以两个数组进行了位置交换。而数组[0,1,2,3]和数组[12,13,14,15]因为横纵坐标相同,因此交换后仍在原位置!im

变换后的俯视图以下:img

clipboard.png

最后,将以立方体形式表示的数组以输入时候的顺序输出,就获得转换后的数组:

array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])

以上就是博主关于transpose这个方法的理解,至于更高维的变换,能够用相似的方式来思考,考虑为一个坐标变换问题,也许就能够更具体的理解到如何变换。


不足之处,欢迎指正。

相关文章
相关标签/搜索