Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python flat和ravel之间的numpy差异()_Python_Numpy - Fatal编程技术网

Python flat和ravel之间的numpy差异()

Python flat和ravel之间的numpy差异(),python,numpy,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],

以下两者之间的区别是什么

>>> 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
返回一个迭代器而不是列表这一事实之外,它们看起来是一样的,因为它们都改变了原来的数组(这与
flatte()
相反,后者返回数组的副本)。那么,
flat
ravel()
之间是否还有其他显著差异?如果不是,什么时候用一个代替另一个有用?

flat
是一个迭代器。它是一个单独的对象,恰好通过索引提供对数组元素的访问。它的主要用途是用于循环和理解表达式。它给出的顺序与您通常从
ravel
获得的顺序相同

ravel
的结果不同,
flat
不是
ndarray
,因此它除了对数组进行索引和迭代之外,没有什么作用。请注意,您必须调用
list
来查看迭代器的内容。例如,
arr.flat.min()

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


也就是说,在某些情况下,迭代器更可取。如果您的数组足够大,并且您正试图逐个检查所有元素,那么迭代器将很好地工作。如果你有一个像内存映射数组这样的数组,它会被分部分加载,这一点尤其正确。

特别是
flat
生成一个
np类型的对象。flatiter
(参见它的文档)。它也是作为数组的一个属性实现的,而不是一个方法或函数。@hpaulj从技术上讲
flat
ndarray
的一个属性,这意味着它基本上是一个作为属性访问的无参数方法,但实际上每次访问它时都返回一个新实例。
flat
(像
shape
)这样的属性是在
numpy
c
代码中定义的,实际上并不使用Python
属性
机制
numpy/core/src/multiarray/getset.c`。它们在功能上看起来很相似。
np.array(arr.flat)
提供了与
np.ravel(x)
更接近(可能相同)。