开发者社区> 问答> 正文

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的上下文中,轴号是什么? 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-09 14:00:50 445 0
1 条回答
写回答
取消 提交回答
  • 要转置数组,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编写的,可以在这里找到。

    2020-02-09 14:01:02
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载