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

问题描述 投票:227回答:3
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]

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

python numpy multidimensional-array flatten numpy-ndarray
3个回答
307
投票

目前的API是:

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

32
投票

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

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


8
投票

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

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

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会返回一份副本
  • 拉威尔会回归一个观点。

我们如何检查是否有副本?使用.basendarray属性。如果是视图,则基数将是原始数组;如果它是副本,基地将是None

© www.soinside.com 2019 - 2024. All rights reserved.