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

b_p*_*kes 13 python numpy

以下有什么区别?

>>> 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]]])
Run Code Online (Sandbox Code Playgroud)

除了flat返回迭代器而不是列表的事实之外,它们看起来是相同的,因为它们都改变了原始数组(这与flatten()返回数组的副本相反).那么,flat和之间还有其他重大区别ravel()吗?如果不是,何时使用一个而不是另一个是有用的?

Mad*_*ist 10

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

与结果不同ravel,flat不是ndarray,所以除了索引数组并迭代它之外它不能做太多.请注意,您必须调用list以查看迭代器的内容.例如,arr.flat.min()会失败AttributeError,但arr.ravel().min()会产生相同的结果arr.min().

由于numpy提供了许多不需要编写显式循环的操作ndarray.flat,并且通常很少使用迭代器ndarray.ravel().

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