咨询Numpy中三维及以上数组transpose的工作机制与元素排布规则
Numpy三维数组转置的工作机制解析
背景铺垫
二维数组转置的内存关联
根据《Numpy指南》:
数组的两种内存布局通过转置操作关联。因此,如果A是(连续的)C风格数组,那么同一块内存可被用来将Aᵀ表示为(连续的)Fortran风格数组。这种底层关联在优化Fortran风格数组的内存使用时非常有用。
三维数组的初始示例
对于三维数组定义:
A = np.arange(6).reshape([1,2,3])
可以将A视为仅包含一个2行3列子矩阵的1×1分块矩阵,理论上可参照二维转置规则迭代处理。
具体问题
针对以下代码:
A = np.arange(6).reshape([1,2,3]) B = A.transpose(1,2,0)
需要明确transpose的工作逻辑,以及B的元素排布规则。
转置的核心逻辑:轴的重排
Numpy的transpose本质就是重新定义数组的轴顺序,传入的元组参数直接指定「新轴对应的原轴索引」。
先明确原数组A的基础属性:
A.shape = (1, 2, 3),对应的轴索引为0(第0维:块数/深度)、1(第1维:行)、2(第2维:列)- A的元素实际结构:
[[[0, 1, 2], [3, 4, 5]]]
执行B = A.transpose(1, 2, 0)时,相当于告诉Numpy:
- B的第0维对应A的第1维
- B的第1维对应A的第2维
- B的第2维对应A的第0维
元素排布的明确规则
根据轴的映射关系,直接推导B的元素位置:
- 先确定B的形状:原A的第1维长度是2,第2维是3,第0维是1,所以
B.shape = (2, 3, 1) - 对B中任意位置
(i, j, k),对应的原A中的位置为(k, i, j)(新轴顺序是(1,2,0),即新轴索引0对应原轴1,新轴1对应原轴2,新轴2对应原轴0,反向映射即可得到原位置)
按此规则推导,B的最终元素结构为:
[[[0], [1], [2]], [[3], [4], [5]]]
补充:内存布局的特性
和二维数组转置一致,transpose不会修改原数组的内存数据,只是创建了一个新的「轴视图」。原A是C风格连续内存布局,转置后的B与A共享同一块内存,此时B的内存布局会变为Fortran风格连续。
内容的提问来源于stack exchange,提问作者zo Aoo
相关产品推荐
相关产品推荐

