![](/img/trans.png)
[英]What is the difference between flatten and ravel functions in numpy?
[英]numpy difference between flat and ravel()
以下有什么区别?
>>> import numpy as np
>>> arr = np.array([[[ 0, 1, 2],
... [ 10, 12, 13]],
... [[100, 101, 102],
... [110, 112, 113]]])
>>> arr
array([[[ 0, 1, 2],
[ 10, 12, 13]],
[[100, 101, 102],
[110, 112, 113]]])
>>> arr.ravel()
array([ 0, 1, 2, 10, 12, 13, 100, 101, 102, 110, 112, 113])
>>> arr.ravel()[0] = -1
>>> arr
array([[[ -1, 1, 2],
[ 10, 12, 13]],
[[100, 101, 102],
[110, 112, 113]]])
>>> list(arr.flat)
[-1, 1, 2, 10, 12, 13, 100, 101, 102, 110, 112, 113]
>>> arr.flat[0] = 99
>>> arr
array([[[ 99, 1, 2],
[ 10, 12, 13]],
[[100, 101, 102],
[110, 112, 113]]])
除了flat
返回迭代器而不是列表这一事实之外,它们看起来是相同的,因为它们都会改变原始数组(这与flatten()
相反,后者返回数组的副本)。 那么, flat
和ravel()
之间还有其他显着的区别吗? 如果没有,何时使用一个而不是另一个是有用的?
flat
是一个迭代器。 它是一个单独的对象,恰好通过索引来访问数组元素。 它的主要目的是在循环和理解表达式中使用。 它给出的顺序与你通常从ravel
得到的顺序相同。
不同的结果ravel
, flat
不是ndarray
,所以它不能做太多,除了索引数组并遍历它。 请注意,您必须调用list
才能查看迭代器的内容。 例如, arr.flat.min()
将失败并出现AttributeError
,而arr.ravel().min()
将给出与arr.min()
相同的结果。
由于numpy
提供了许多不需要显式循环的操作,因此与ndarray.ravel()
相比,很少使用ndarray.flat
和迭代器。
话虽这么说,有些情况下迭代器更可取。 如果你的数组足够大并且你试图逐个检查所有元素,那么迭代器就可以正常工作。 如果您有像内存映射数组一样的部分加载,则尤其如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.