以下两者有什么区别?

>>> 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中得到的顺序相同。
ravel的结果不同,flat不是一个ndarray,因此除了索引数组和在数组上迭代之外,它不能做很多事情。注意,您必须调用list来查看迭代器的内容。例如,arr.flat.min()将失败,而AttributeError将给出与arr.ravel().min()相同的结果。
由于arr.min()提供了许多不需要编写显式循环的操作,因此与numpy相比,通常很少使用ndarray.flat和迭代器。
也就是说,有些情况下迭代器更可取。如果数组足够大,并且您试图逐个检查所有元素,那么迭代器就可以很好地工作。如果您有一个像内存映射数组这样的部分加载的东西,这一点尤其正确。

关于python - 扁平和拉威尔之间的差异(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38357811/

10-11 04:28