In [28]: arr = np.arange(16).reshape((2, 2, 4))
In [29]: arr Out[29]: array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
In [32]: arr.transpose((1, 0, 2)) Out[32]: array([[[ 0, 1, 2, 3], [ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
当我们将整数元组传递给transpose()函数时,会发生什么?
具体来说,这是一个3D数组:当我传递轴的元组时,NumPy如何变换数组(1, 0 ,2)?您能解释这些整数指的是哪行或哪一列?在NumPy的上下文中,轴号是什么? 问题来源于stack overflow
要转置数组,NumPy只需交换每个轴的形状和步幅信息。这是大步前进:
arr.strides (64, 32, 8)
arr.transpose(1, 0, 2).strides (32, 64, 8) 请注意,转置操作将步幅交换为轴0和轴1。这些轴的长度也被交换了(2在此示例中,两个长度都相同)。
无需复制任何数据即可完成此操作;NumPy可以简单地更改其查看基础内存的方式以构造新数组。
可视化步幅 步幅值表示为了到达数组轴的下一个值而必须在内存中传输的字节数。
现在,我们的3D数组arr看起来如下(带有标记的轴):
在此处输入图片说明
这个数组存储在一个连续的内存块中 ; 本质上是一维的。要将其解释为3D对象,NumPy必须跳过一定的恒定字节数才能沿三个轴之一移动:
在此处输入图片说明
由于每个整数占用8个字节的内存(我们使用的是int64 dtype),因此每个维度的步幅值是需要跳转的值数的8倍。例如,要沿轴1移动,则要跳过四个值(32字节),而要沿轴0移动,则要跳过八个值(64字节)。
当我们写时,arr.transpose(1, 0, 2)我们交换的是轴0和1。转置后的数组如下所示:
在此处输入图片说明
NumPy需要做的就是交换轴0和轴1的步幅信息(轴2不变)。现在,我们必须跳得更远,才能沿着轴1而不是轴0:
在此处输入图片说明
这个基本概念适用于数组轴的任何排列。处理转置的实际代码是用C编写的,可以在这里找到。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。