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


292
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]

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


14
Ravel通常将视图返回到现有数组中(有时会返回一个副本)。Flatten返回一个新数组。
亚历克斯(Alex)


1
是细微差别的实际证明。
prosti

那么有人可以举一个例子,什么时候最好展平数组,什么时候拆散数组呢?
Aleksandar

Answers:


371

当前的API是:

  • flatten 总是返回一个副本。
  • ravel尽可能返回原始数组的视图。这在打印输出中不可见,但是如果您修改ravel返回的数组,则可能会修改原始数组中的条目。如果您修改从flatten返回的数组中的条目,则将永远不会发生。ravel通常会更快,因为没有内存被复制,但是您在修改返回的数组时要格外小心。
  • reshape((-1,)) 只要数组的步幅允许,就可以得到一个视图,即使这意味着您并不总是可以获得连续的数组。

30
知道为什么NumPy开发人员不坚持使用某个参数copy = [True,False]的功能吗?
Franck Dernoncourt 2015年

41
Backcompat保证有时会导致类似这样的事情发生。例如:numpy开发人员最近(在1.10版本中)添加了一个以前的隐式保证,即ravel将返回一个连续数组(此属性在编写C扩展时非常重要),因此现在API a.flatten()肯定是要获取副本,a.ravel()以避免大多数副本,但仍保证返回的数组是连续的,并且a.reshape((-1,))只要数组的步幅允许它就可以真正获取视图,即使这意味着您不一定总是得到连续的数组。
IanH

4
@Hossein IanH解释了这一点:ravel保证连续数组,因此不能保证它返回视图;reshape总是返回一个视图,因此不能保证它返回一个连续的数组。
il in

4
@Hossein这将是一个全新的问题。简而言之,读取和写入连续的内存空间要快得多。关于SO,这里有几个问题和答案(这里是一个很好的示例),如果您还有其他问题,请随时打开一个新问题。
il in

2
reshape(-1)等效于reshape((-1,))
Tom Pohl

53

如此所述,关键区别在于:

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

  • ravel 是库级别的函数,因此可以在任何可以成功解析的对象上调用。

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

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


4
关于在ravel()列表上工作ndarray
ravel

不仅数组列表,而且列表列表:)
timtody

15

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

这两个函数均返回指向新存储器结构的展平一维数组。

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

在上例中:

  • 结果的存储位置不同,
  • 结果看起来一样
  • 展平将返回副本
  • ravel将返回一个视图。

我们如何检查某物是否是副本?使用的.base属性ndarray。如果是视图,则基础将是原始数组;如果是副本,则基数为None

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.