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)
更接近(可能相同)。