【问题标题】:Differences between X.ravel() and X.reshape(s0*s1*s2) when number of axes known已知轴数时 X.ravel() 和 X.reshape(s0*s1*s2) 之间的差异
【发布时间】:2016-01-12 01:06:21
【问题描述】:

看到这个answer我想知道X的扁平化视图的创建是否本质上是一样的,只要我知道X中的轴数是3:

A = X.ravel()

s0, s1, s2 = X.shape
B = X.reshape(s0*s1*s2)

C = X.reshape(-1)  # thanks to @hpaulj below

我不是在问 A 和 B 和 C 是否相同。

我想知道在这种情况下 ravelreshape 的特定用法是否基本相同,或者两者之间是否存在显着差异、优点或缺点 ,前提是您提前知道 X 的轴数。

第二种方法需要几微秒,但这似乎与大小无关。

【问题讨论】:

    标签: numpy


    【解决方案1】:

    看看他们的__array_interface__ 并做一些计时。我能看到的唯一区别是ravel 更快。

    .flatten() 有一个更显着的区别 - 它返回一个副本。

    A.reshape(-1)
    

    是使用 reshape 的一种更简单的方法。

    您可以研究相应的文档,看看是否还有其他内容。我还没有研究过当你指定order 时会发生什么。

    如果我只希望它是 1d,我会使用 ravel。我最常使用.reshape 将一维(例如arange())更改为nd。

    例如

    np.arange(10).reshape(2,5).ravel()
    

    或者选择让你的代码最易读的那个。


    reshaperavelnumpyC代码中定义:

    https://github.com/numpy/numpy/blob/0703f55f4db7a87c5a9e02d5165309994b9b13fd/numpy/core/src/multiarray/shape.c

    PyArray_Ravel(PyArrayObject *arr, NPY_ORDER order) 需要将近 100 行 C 代码。如果订单发生变化,它会转至PyArray_Flatten

    在同一个文件中,reshape 平底船到 newshape。这反过来返回一个view 是形状实际上并没有改变,尝试_attempt_nocopy_reshape,最后返回一个PyArray_NewCopy

    两者都使用 PyArray_NewshapePyArray_NewFromDescr - 取决于形状和顺序如何混合和匹配。

    因此,确定 reshape (to 1d) 和 ravel 的不同之处需要仔细研究。


    另一种方法是创建一个新数组,具有新的形状,但数据缓冲区相同:

    np.ndarray((24,),buffer=A.data)
    

    它的时间与reshape 相同。它的__array_interface__ 是一样的。我不推荐使用这种方法,但它可能会澄清这些重塑/拉威尔函数发生了什么。他们都制作了一个新的数组,具有新的形状,但共享数据(如果可能的话)。时序差异是函数调用序列不同(在 Python 和 C 中)的结果,而不是数据处理方式不同的结果。

    【讨论】:

    • 谢谢@hpaulj,但我正在寻找一个明确的答案。额外的微秒必须意味着什么。不过.reshape(-1) 很有帮助!
    • 这需要在编译后的代码中找到它们。显然ravel 采取直接路线,reshape 采取更一般的路线。是我去挖还是你来?
    • 您当然不需要“做”任何事情!回答问题是自愿的——不是吗?但现在我只能阅读python。也许其他人可能知道?
    • 我们谈论的是一级函数重定向产生重大影响的时代。只要结果是view,“数据”的处理方式就没有区别。
    • 哇!这就是我所说的确定性答案!!我(和其他人)实际上可以从你的讨论中学到很多东西。这真的很有帮助,我很感激你的时间“深入”。现在我了解了不随大小变化的显着时间差异。到目前为止,我觉得ravel()扁平化视图的首选,因为它似乎是最快的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多