numpy中的flatten和ravel函数有什么区别?
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]
两个函数都返回相同的列表。 那么执行同样工作的两种不同function需要什么呢?
目前的API是这样的:
-
flatten
总是返回一个副本。 -
ravel
尽可能返回原始数组的视图。 这在打印输出中是不可见的,但是如果修改由ravel返回的数组,它可能会修改原始数组中的条目。 如果你修改从flatten返回的数组中的条目,这将永远不会发生。 ravel通常会更快,因为没有内存复制,但你必须更加小心修改它返回的数组。 - 每当数组的步幅允许时
reshape((-1,))
都会得到一个视图,即使这意味着你不总是得到一个连续的数组。
正如这里所解释的,一个关键的区别是flatten
是一个ndarray对象的方法,因此只能被称为真正的numpy数组。 相比之下, ravel()
是一个库级函数,因此可以在任何可以成功parsing的对象上调用。 例如,ravel ravel()
将在ndarrays列表上工作,而Flatten对于该types的对象不可用。
@IanH也在回答中指出了与记忆处理的重要区别。