numpy.transpose处理三维数组的转置逻辑与索引映射解析
本文深入解析numpy中transpose函数对三维数组的转置机制。通过对比正序与转置后的数组结构,详细阐述轴参数(如1,0,2)如何导致页面与行数据的互换。文章结合具体索引值变化,解释转置前后元素位置的对应关系,并验证多次连续转置等效于单一复合转置序列,帮助开发者准确掌握多维数组变换规律。
具体实现过程如下所示:
import numpy as np
针对三维数组的操作
arr1 = np.arange(16).reshape((2, 2, 4)) #[[[ 0 1 2 3] # [ 4 5 6 7]] # [[ 8 9 10 11] # [12 13 14 15]]] arr2=arr1.transpose((1,0,2)) #[[[ 0 1 2 3] # [ 8 9 10 11]] # # [[ 4 5 6 7] # [12 13 14 15]]]
默认的正序排列为(0,1,2),此时数组结构为
#[[[ 0 1 2 3] # [ 4 5 6 7]] # [[ 8 9 10 11] # [12 13 14 15]]]
当执行transpose(1,0,2)操作后,数组结构变为
#[[[ 0 1 2 3] # [ 8 9 10 11]] # # [[ 4 5 6 7] # [12 13 14 15]]]
通过对比观察,可以发现转置后的数组与原数组的主要差异在于:第一页的第二行与第二页的第一行发生了位置互换。那么,这一现象背后的具体原因是什么?
在原始数组arr1中,通过索引arr1[0,1,0]访问到的元素值为4。
而在转置后的数组arr2中,通过索引arr2[1,0,0]访问到的元素值同样为4。
对比索引参数的变化以及正序与转置序的不同,似乎存在某种内在的联系。
对于arr1数组,索引参数表[0,0,x]对应的是第一页的第一行。当执行前两个参数对换的操作后,该元素在转置数组中的索引参数表并未发生数值上的变化(仍保持前两位为0,0的特征)。
因此,arr2的第一页第一行内容与arr1的第一页第一行内容完全相同。
对于arr1数组,索引参数表[0,1,x]对应的是第一页的第二行。当执行前两个参数对换操作后,同一个元素对应的索引值例如[0,1,0]在转置数组中变为[1,0,0]。
这解释了为何索引值为4的元素在转置前后,其索引参数表发生了上述特定的变化。
基于上述思路,transpose(1,0,2)操作导致数组的第一页第二行与第二页第一行发生互换。
其余四种转置方式也遵循类似的逻辑,通过仔细观察索引变化,理解起来并不困难。
arr3=arr1.transpose((0,2,1)) # [[[ 0 4] # [ 1 5] # [ 2 6] # [ 3 7]] # # [[ 8 12] # [ 9 13] # [10 14] # [11 15]]] arr4=arr1.transpose((2,0,1)) #[[[ 0 4] # [ 8 12]] # # [[ 1 5] # [ 9 13]] # # [[ 2 6] # [10 14]] # # [[ 3 7] # [11 15]]]
这里需要特别注意,arr4数组变成了4页,这是因为页码维度与行码维度对换之后,
页码的数量从原来的2增加到了4。
而行码的数量从原来的4减少到了2。
arr5=arr1.transpose((2,1,0)) #[[[ 0 8] # [ 4 12]] # # [[ 1 9] # [ 5 13]] # # [[ 2 10] # [ 6 14]] # # [[ 3 11] # [ 7 15]]] arr6=arr1.transpose((1,2,0)) #[[[ 0 8] # [ 1 9] # [ 2 10] # [ 3 11]] # # [[ 4 12] # [ 5 13] # [ 6 14] # [ 7 15]]]
此外,转置操作(2,0,1)可以视为先执行转置(0,2,1),再执行转置(1,0,2)的组合结果。
转置操作(2,1,0)可以分解为:先执行转置(1,0,2),接着执行转置(0,2,1),最后再执行转置(1,0,2)。
转置操作(1,2,0)可以分解为:先执行转置(1,0,2),随后执行转置(0,2,1)。
相应的代码实现可以写成
arr4=arr1.transpose(0,2,1).transpose(1,0,2)
#[[[ 0 4] # [ 8 12]] # # [[ 1 5] # [ 9 13]] # # [[ 2 6] # [10 14]] # # [[ 3 7] # [11 15]]]
最终得到的结果完全一致!
以上关于numpy.transpose处理三维数组转置方法的解析即为全部内容,希望能为大家提供有价值的参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









