numpy中的flatten和ravel有啥区别? [复制]
Posted
技术标签:
【中文标题】numpy中的flatten和ravel有啥区别? [复制]【英文标题】:What is the difference between flatten and ravel in numpy? [duplicate]numpy中的flatten和ravel有什么区别? [复制] 【发布时间】:2015-05-04 10:18:19 【问题描述】:Numpy v 1.9 包含两个看似相同的函数: 'flatten' 和 'ravel'
有什么区别?我什么时候可以选择一个来将二维 np.array 转换为一维?
【问题讨论】:
如果您阅读了您链接的文档,请注意flatten
将始终“返回副本”,而ravel
将仅制作副本如果需要”.
我确实在文档中读过,但仅在需要时是什么意思?什么情况下不需要? NP如何知道是否需要它?在进一步的测试中,似乎在某些情况下 flatten 不适用于数组,但 ravel 会。仍然不确定为什么。这是我希望通过问题征求的信息类型。
那么也许这就是你应该问的......
感谢您提供有用的链接,但它肯定不能回答我更笼统的问题:这两个功能之间有什么区别以及为什么选择另一个。在下面查看我的答案。它可能是基本的,但关键区别在于一个是方法,另一个是函数。这种区别肯定没有在另一个问题中得到解决,并且在很大程度上解释了为什么有两个“功能”。这些以及也许其他的区别也使我的问题不再重复,所以我恳请您删除那个误导性的标志。
@BryanP:关于 SO 受欢迎程度是一回事 :')
【参考方案1】:
啊哈:
主要的功能区别在于flatten
是 ndarray 对象的 方法,因此只能为真正的 numpy 数组调用。相比之下,ravel()
是一个库级函数,因此可以在任何可以成功解析的对象上调用。例如ravel()
将适用于 ndarrays 列表,而 flatten(显然)不会。
此外,正如@jonrsharpe 在他的评论中指出的那样,flatten 方法总是返回一个副本,而 ravel 只在“需要时”这样做。仍然不太清楚这个决定是如何做出的。
【讨论】:
即使你通过多维索引访问你的数组,在内存中元素仍然是线性顺序寻址的(使用简单的光栅扫描模式将多索引转换为线性索引) .如果您要求元素的顺序与它们已经存储在内存中的顺序相同,我希望 numpy 返回一个“视图”(并且仅在您请求需要元素序列的维度排序时才返回副本) -要重新洗牌的内存)。以上是关于numpy中的flatten和ravel有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
numpy.ravel() vs numpy.flatten()
numpy 辨异 —— numpy ravel vs numpy flatten
numpy 矩阵变换 reshape ravel flatten