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

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


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

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

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进行转置:

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]。这句话看起来很有道理,但究竟是怎么变换的呢?通过这句话仍然难以想象,所以我们把这个数组放在三维坐标下来看:

clipboard.png

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

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轴!

整个过程中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]由于横纵坐标相同,所以交换后仍在原位置!

变换后的俯视图如下:

clipboard.png

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

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

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

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


不足之处,欢迎指正。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值