【问题标题】:Transpose array and actually reorder memory转置数组并实际重新排序内存
【发布时间】:2013-11-07 01:24:49
【问题描述】:

我有一个 3-D NumPy 数组,例如

a = np.random.random((2,3,5))

我想转置最后两个轴,即

b = a.transpose(0,2,1)

但是,我不想要步履蹒跚的观点!我想实际复制数组并将其重新排序在内存中。实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: memory numpy transpose


    【解决方案1】:

    copy() 方法默认会重新排序为 C 连续顺序:

    b = a.transpose(0,2,1).copy()
    

    小心:copy() 函数 具有不同的默认行为。使用该函数,您必须明确指定顺序以确保 C 连续副本:

    b = np.copy(a.transpose(0,2,1), order='C')
    

    (请注意,该函数的文档字符串表明 ndarray 方法是创建数组副本的首选方法。)

    【讨论】:

    • 谢谢。在您发布您的解决方案之前,我刚刚找到的解决方案是b = np.zeros((2,5,3)); b[:] = a.transpose(0,2,1),但您的解决方案要干净得多。
    【解决方案2】:

    实际上,b 的步幅与 a 不同。

    更喜欢使用ascontiguousarray,它会在需要时复制内存。而copy 将始终复制内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2018-11-04
      相关资源
      最近更新 更多