【问题标题】:Why would NumPy reshape() create a new array and why might order not be preserved?为什么 NumPy reshape() 会创建一个新数组,为什么不保留顺序?
【发布时间】:2016-06-20 19:00:21
【问题描述】:

关于检查numpy.reshape 调用是否已返回副本 [12] 有几个问题。这些问题通常是由于文档中含糊的警告提出的:

如果可能,这将是一个新的视图对象;否则,它将是一个副本。

我想知道 NumPy 在什么情况下会返回一个副本?在我测试过的每个 2D reshape 调用中,来自用户 jterrace 在2 中的回答的方法表明内存基础是相同的(即不是副本)。是不是只有更高维度的reshape才可能需要复制?

此外,来自文档的警告的第二部分通知用户:

...不保证返回数组的内存布局(C 或 Fortran 连续)。

换句话说,您可能会要求行优先,但您可以获得列优先输出。这不是破坏了order 参数的全部目的吗?什么时候会出现这种情况?

【问题讨论】:

    标签: python arrays numpy reshape


    【解决方案1】:

    我想知道 NumPy 在什么情况下会返回副本?

    In [13]: x = numpy.array([[1, 2, 3],
       ....:                  [4, 5, 6]])
    
    In [14]: x[:, :2].reshape([4]).base is x
    Out[14]: False
    

    如果步幅不适用于新形状,NumPy 必须复制。

    换句话说,您可能会要求行优先,但您可以获得列优先输出。这不是破坏了order 参数的全部目的吗?

    没有。 numpy.reshape 无法请求特定的内存布局。 order 参数指定读取元素的索引顺序;它与内存布局无关。

    【讨论】:

    • 换句话说,为了得到想要的内存布局,是否需要显式地将其写入内存中的副本?
    • 详细说明,最后一次整形产生array([1, 2, 4, 5]),是原始[1,2,3,4,5,6]的一个子集。
    • 好的。那么我是否也理解副本出现的唯一时间是不是所有原始数据都通过重塑保留?就像在这个跨步示例中一样
    • 对于同一个xx.T.reshape(2,3) 是一个副本。所有的数据都在那里,但它们的排列顺序不同。
    • @marcman:不,这与它无关。当结果数组的元素沿视图的每个轴在内存中的步幅不一致时,就会出现副本。
    猜你喜欢
    • 2017-11-02
    • 2012-08-02
    • 2012-11-23
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    相关资源
    最近更新 更多