numpy.transpose处理三维数组的转置逻辑与索引映射解析

巷口听风
巷口听风
发布时间:2026-10-13 | 4人浏览过
原创

本文深入解析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处理三维数组转置方法的解析即为全部内容,希望能为大家提供有价值的参考,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表