首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >numpy中的flatten和ravel函数有什么不同?

numpy中的flatten和ravel函数有什么不同?
EN

Stack Overflow用户
提问于 2015-03-09 02:49:44
回答 3查看 98.5K关注 0票数 379
代码语言:javascript
复制
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]

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-09 03:00:12

当前接口为:

只要有可能,

  • flatten总是返回一个copy.
  • ravel,返回原始数组的一个视图。这在打印输出中不可见,但如果修改ravel返回的数组,它可能会修改原始数组中的条目。如果你修改了从flatten返回的数组中的条目,这种情况永远不会发生。ravel通常会更快,因为没有复制内存,但你必须更加小心地修改数组只要数组的步长允许,returns.
  • reshape((-1,))就会得到一个视图,即使这意味着你并不总是得到连续的数组。
票数 462
EN

Stack Overflow用户

发布于 2016-11-26 10:45:24

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

  • flatten是ndarray对象的一个方法,因此只能在真正的numpy时调用。arrays.
  • ravel是一个库级函数,因此可以在任何可以成功解析的对象上调用。

例如,ravel将处理ndarray列表,而flatten不适用于该类型的对象。

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

票数 71
EN

Stack Overflow用户

发布于 2019-01-23 01:11:31

以下是函数的正确名称空间:

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

代码语言:javascript
复制
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属性。如果它是一个视图,基数组将是原始数组;如果它是一个副本,基数组将是None

检查a2是否为a1的副本

代码语言:javascript
复制
import numpy
a1 = numpy.array([[1,2],[3,4]])
a2 = a1.copy()
id(a2.base), id(a1.base)

输出:

代码语言:javascript
复制
(140735713795296, 140735713795296)
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28930465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档