繁体   English   中英

扁平和拉威尔之间的差异()

[英]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()相反,后者返回数组的副本)。 那么, flatravel()之间还有其他显着的区别吗? 如果没有,何时使用一个而不是另一个是有用的?

flat是一个迭代器。 它是一个单独的对象,恰好通过索引来访问数组元素。 它的主要目的是在循环和理解表达式中使用。 它给出的顺序与你通常从ravel得到的顺序相同。

不同的结果ravelflat不是ndarray ,所以它不能做太多,除了索引数组并遍历它。 请注意,您必须调用list才能查看迭代器的内容。 例如, arr.flat.min()将失败并出现AttributeError ,而arr.ravel().min()将给出与arr.min()相同的结果。

由于numpy提供了许多不需要显式循环的操作,因此与ndarray.ravel()相比,很少使用ndarray.flat和迭代器。

话虽这么说,有些情况下迭代器更可取。 如果你的数组足够大并且你试图逐个检查所有元素,那么迭代器就可以正常工作。 如果您有像内存映射数组一样的部分加载,则尤其如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM