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

DEE*_*DAV 256 python numpy flatten multidimensional-array numpy-ndarray

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]
Run Code Online (Sandbox Code Playgroud)

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

Ian*_*anH 337

目前的API是:

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

  • Backcompat保证有时会导致像这样的奇怪事情发生.例如:numpy开发人员最近(在1.10中)添加了一个先前的隐式保证,ravel将返回一个连续的数组(在编写C扩展时非常重要的属性),所以现在API是`a.flatten()`一个副本肯定,`a.ravel()`以避免大多数副本,但仍然保证返回的数组是连续的,并且`a.reshape(( - 1,))`以便在数组的步幅时真正获得视图允许它,即使这意味着你并不总是得到一个连续的数组. (37认同)
  • 知道为什么NumPy开发人员没有坚持一个参数copy = [True,False]的函数? (22认同)
  • 为什么叫“拉威尔”?这个名字背后的想法是什么? (7认同)
  • @Hossein IanH解释说:`ravel`保证一个连续的数组,因此不能保证它返回一个视图; `reshape`总是返回一个视图,因此不能保证它返回一个连续的数组. (4认同)
  • @Hossein这将是一个全新的问题.非常简单,读取和写入连续的内存空间要快得多.这里有几个问题和答案在SO([这里很好的例子](http://stackoverflow.com/questions/4059363/what-is-a-contiguous-memory-block)),随时开一个新的一,如果你有任何进一步的问题. (4认同)
  • @iled:谢谢,那么连续性有什么重要的呢?我为什么要关心这个? (2认同)
  • `reshape(-1)`相当于`reshape(( - 1,))` (2认同)
  • 正如这些讨论所揭示的那样,Numpy 很棒,但并不完美。 (2认同)

Bry*_*n P 38

正如这里所解释的,一个关键的区别是它flatten是一个ndarray对象的方法,因此只能被调用为真正的numpy数组.相反,它ravel是一个库级函数,因此可以在任何可以成功解析的对象上调用.例如,ravel将在ndarrays列表上工作,而flatten不适用于该类型的对象.

@IanH还在他的回答中指出了与记忆处理的重要区别.

  • 有关ravel()在ndarray列表上工作的信息的信息 (3认同)

pro*_*sti 11

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

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

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
Run Code Online (Sandbox Code Playgroud)

在上例中:

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

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