首先说明,这个方法是博主在理解高维数组转置的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]
。这句话看起来很有道理,但究竟是怎么变换的呢?通过这句话仍然难以想象,所以我们把这个数组放在三维坐标下来看:
在这里我假设这个三维数组在空间中按上图的方式排列,数组里每个数字存放在一个小立方体中,更具体一点,我们的俯视图如下:
有了这个图就好理解了,我们通过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]
由于横纵坐标相同,所以交换后仍在原位置!
变换后的俯视图如下:
最后,将以立方体形式表示的数组以输入时候的顺序输出,就得到转换后的数组:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
以上就是博主关于transpose
这个方法的理解,至于更高维的变换,可以用类似的方式来思考,考虑为一个坐标变换问题,也许就可以更具体的理解到如何变换。
不足之处,欢迎指正。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。