NumPy的transpose()方法如何排列数组的轴?

胡锦涛:
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的上下文中,轴号是什么?

亚历克斯·赖利(Alex Riley):

为了转置数组,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编写的,可以在这里找到

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章