在numpy中,flatten和ravel有什么区别?

24
Numpy v1.9包含两个看似相同的函数: 'flatten''ravel'
它们的区别是什么?在将2-D np.array转换为1-D时,我应该选择哪个函数?

5
如果您阅读了您提供的文档,请注意 flatten 总是会“返回一个副本”,而 ravel 只有在必要时才会“复制”。 - jonrsharpe
3
我确实在文档中看到了这个,但只有在需要的情况下是什么意思呢?有哪些情况下不需要使用它?NP如何知道是否需要使用它?进一步测试中似乎还有一些情况,flatten无法对数组起作用,而ravel可以。仍然不确定原因是什么。这就是我希望通过这个问题获得的类型信息。 - Bryan P
2
那么也许那就是你应该问的问题... - jonrsharpe
感谢提供有用的链接,但它并没有回答我的更一般的问题:这两个函数之间有什么区别,为什么要选择其中一个。请查看下面的答案。它可能很基础,但一个关键的区别是一个是方法,另一个是函数。这种区别在其他问题中肯定没有得到解决,并且可以很好地解释为什么有两个“函数”。这些以及其他区别也使我的问题不是重复的,因此我恳请您删除那个误导性的标记。 - Bryan P
@NikanaReklawyks:我在5天前提出了我的问题链接;所以应该将这个标记为重复。 - Bryan P
2
@BryanP:在SO上,受欢迎程度是一件很重要的事情 :') - Nikana Reklawyks
1个回答

42

Aha: 主要的功能区别是flatten是一个ndarray对象的方法,因此只能对真正的numpy数组进行调用。相比之下,ravel()是一个库级别的函数,可以针对可以成功解析的任何对象进行调用。例如,ravel()可以在一个ndarrays列表上工作,而flatten(显然)则不能。

此外,如@jonrsharpe在他的评论中指出,flatten方法总是返回一个副本,而ravel只在“需要时”才这样做。仍不确定如何进行这种确定。


即使您通过多维索引访问数组,在内存中元素仍然是按线性顺序寻址的(使用简单的光栅扫描模式将多索引转换为线性索引)。如果您要求numpy返回与它们已经存储在内存中相同顺序的元素,则我会期望它返回一个“视图”(仅在您请求需要重新排列内存中元素顺序的维度排序时才返回副本)。 - benjimin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接