百度了很多文章,应该没有像下文一样的在讲transpose函数之前分析了数组的形状特征的,而看了分析,自然就懂transpose的功能了,对于一个多维数组,有三个概念非常重要,1、数组的维度的排序,2、每一个维度的索引数,3、最终元素的索引号。
多维数组的形状由维度的排序和每一个维的维度的所含的索引数决定。下面结合三维数组b来说明。
b=array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10(0(0),2(1),2(2)), 11]],
[[12, 13, 14, 15],
[16, 17,18, 19],
[20, 21,22, 23]]])
(a)原始维度的排序序号:(0,1,2),(从外到里的维分别叫第一第二第三维,序号分别为0,1,2)——决定数组形状的因素1,
(b)包含每一个维的索引数的维度:(2(0),3(1),4(2))——决定数组的形状的因素2,(索引从0开始,2就是有2个索引,号码分别为0,1,4就是有4个索引,号码分别为0,1,2,3),以上刚好对应着数组b的情况。
(c)某个元素在三维维度中的索引,比如元素10,在三维维度中的索引:(0(0),2(1),2(2))——决定着最底层元素的位置。
我现在要将原来每一个维度的序号进行调换或者重新排序,而保持元素原来的维度的对应的索引不变,我们研究下这样的变换是一种什么样的结果,这个变换其实就是下面说的transpose函数的功能,假如由原来的(0,1,2)变成了(2,1,0),
(1)我们先来考察对b元素的位置改变的影响,针对某个元素,就拿b数组中的元素10来说好了,目前他的索引是(0,2,2),维的排序是(0,1,2),变换之后呢,索引变成了(2,2,0),这个怎么得来的呢,其实把维度的排序和元素对应的每一个维度的索引号关联起来就很明白了,结果为:(2(2),2(1),0(0)),注意下标就是上面的(2,1,0)。
(2)然后我们考察维度序号变化(还是跟上面一样,把维度的排序后从(0,1,2)变成了(2,1,0)),对原来每个维度的索引数变化的影响。原来数组b的每一个维度的索引数为,(2(0),3(1),4(2)),变化之后变为了:(4(2),3(1),2(0)),也就是说只是维度的排列序号发生了变化,而之前的每一个维度的信息(比如索引数)是保持不变的。
(d)从上面可以看到,新数组的维度的索引数的排列跟以前不一样了,元素对应的索引号也不一样了。由b变成的新的数组为:
c=array([[[ 0,12],
[ 4, 16],
[ 8, 20]],
[[ 1, 13],
[ 5, 17],
[ 9, 21]],
[[ 2, 14],
[ 6, 18],
[10(2(2),2(1),0(0)),22]],
[[ 3, 15],
[ 7, 19],
[11, 23]]])
注意上面元素10的位置和索引号的变化。
其实上面的数组c就是经过:
c=b.transpose(2,1,0)这个运算得来的,2,1,0代表的是新的维度排序号,上面已经分析过不再详细展开。那么对于b.transpose(1,2,0)其实道理也一样的。
总结:总结:对于多维数组,特别是三维以上的数组,每个元素(最底层的不可分割的)需要有多个索引确定,三维就需要三个索引,四维就需要四个索引,依次类推。每一个维的索引都是从0开始算,至于每一个维多少个索引,都需要人为或者机器去定,有多少维,每一个维多少个索引决定着数组的形状(shape)千差万别)。每一个维的索引个数其实就决定着每一个维的弹性大小。除了讨论有多少维,每一个维多少个索引外,其实我们都有一个默认的约定的一直没讨论到的东西,那就是每一个维在所有维当中的一个排序,而transpose函数就是改变了原来数组的维的排序,从而导致整个数组发生了翻天覆地的变换。