当前位置: 首页 > 知识库问答 >
问题:

numpy中的flature和ravel函数有什么区别?

慕容念
2023-03-14
import numpy as np
y = np.array(((1,2,3),(4,5,6),(7,8,9)))
OUTPUT:
print(y.flatten())
[1   2   3   4   5   6   7   8   9]
print(y.ravel())
[1   2   3   4   5   6   7   8   9]

这两个函数返回相同的列表。那么两个不同的功能执行相同的工作需要什么。

共有3个答案

赫连昕
2023-03-14

这是函数的正确命名空间:

>

  • numpy.narray扁平

    numpy.ravel

    这两个函数都返回指向新内存结构的扁平化 1D 数组。

    import numpy
    a = numpy.array([[1,2],[3,4]])
    
    r = numpy.ravel(a)
    f = numpy.ndarray.flatten(a)  
    
    print(id(a))
    print(id(r))
    print(id(f))
    
    print(r)
    print(f)
    
    print("\nbase r:", r.base)
    print("\nbase f:", f.base)
    
    ---returns---
    140541099429760
    140541099471056
    140541099473216
    
    [1 2 3 4]
    [1 2 3 4]
    
    base r: [[1 2]
     [3 4]]
    
    base f: None
    

    在上面的示例中:

    • 结果的内存位置不一样,
    • 结果看起来一样
    • flatten会退回一份
    • ravel会返回一个视图。

    我们如何检查某些东西是否是副本?使用 ndarray.base 属性。如果是视图,则基数将为原始数组;如果是副本,则基数将为“无”

    检查 a2 是否为 a1 的副本

    import numpy
    a1 = numpy.array([[1,2],[3,4]])
    a2 = a1.copy()
    id(a2.base), id(a1.base)
    

    出:

    (140735713795296, 140735713795296)
    

  • 符学
    2023-03-14

    正如这里所解释的,一个关键的区别是:

    >

  • flatten是ndarray对象的一种方法,因此只能为真正的numpy数组调用。

    < code>ravel是一个库级函数,因此可以在任何可以成功解析的对象上调用。

    例如,ravel 将处理一个 ndarray 列表,而扁平化则不适用于该类型的对象。

    @IanH在回答中还指出了与内存处理的重要区别。

  • 伊温书
    2023-03-14

    当前的API是:

    • flatten总是返回一个副本。
    • ravel尽可能返回原始数组的视图。这在打印输出中不可见,但如果您修改ravel返回的数组,它可能会修改原始数组中的条目。如果您修改从flatten返回的数组中的条目,这将永远不会发生。ravel通常会更快,因为没有内存被复制,但您必须更加小心地修改它返回的数组。
    • reshape((-1,))在数组的步幅允许时获取视图,即使这意味着您并不总是获得连续数组。
     类似资料:
    • 问题内容: Numpy和函数之间有什么区别?什么时候应该使用一个而不是另一个?他们似乎为我能想到的所有输入生成了相同的输出。 问题答案: 由于将其他问题重定向到这个询问问题或其他数组创建例程的问题,因此可能有必要简要概述每个问题的作法。 区别主要在于何时返回不变的输入,而不是将新数组作为副本。 提供多种选择(其他大多数功能都围绕着薄包装纸),包括用于确定何时复制的标志。完整的解释将和文档一样长(请

    • numpy的和函数之间有什么区别?什么时候你应该用一个而不是另一个?它们似乎为我能想到的所有输入生成相同的输出。

    • 问题内容: 和Numpy有什么区别?我在哪里可以找到numpy源代码中的实现? 问题答案: 只是创建一个便利函数; 它本身不是类。 您也可以使用创建数组,但不建议这样做。来自以下文档的字符串: 阵列应该使用来构造,或…这里给出的参数是指低级方法(用于实例化阵列)。 实现的大部分内容都在C代码中(在multiarray中),但是您可以在这里开始查看ndarray接口: https://github.

    • 问题内容: 他们似乎都 非常 相似,我很好奇哪个软件包对财务数据分析更有利。 问题答案: 熊猫提供了基于NumPy构建的高级数据处理工具。NumPy本身是一个相当底层的工具,类似于MATLAB。另一方面,pandas提供了丰富的时间序列功能,数据对齐,对NA友好的统计信息,groupby,合并和联接方法以及许多其他便利。近年来,它在金融应用中变得非常流行。我的下一本书将专门讨论使用熊猫进行财务数据

    • Numpy中的和之间有什么区别?我在哪里可以找到numpy源代码中的实现?

    • 问题内容: 我可以在Swift库中看到这些定义: 定义为的成员函数与定义为的另一个成员函数有什么区别?仅仅是为了结构和枚举的静态功能,以及用于类和协议吗?还有其他应该知道的区别吗?在语法本身中具有这种区别的原理是什么? 问题答案: 是否仅将static用于结构和枚举的静态函数,将class用于类和协议? 那是主要区别。其他一些区别是类函数是动态调度的,并且可以被子类覆盖。 协议使用class关键字