Numpy中flaten()与ravel()的区别

对于numpy的ndarray,用flatten函数和ravel函数都可以实现对高维度的array进行扁平化。但是二者之间存在着差异:用flatten函数返回的是分配了新的内存地址的一个新的扁平化array,而用ravel函数则返回原内存地址的数组的一个扁平化视图。如果修改这个视图,则同时对原来的数组也进行了修改,因此在使用的时候要特别小心。一般情况下,尽量采用flatten函数。
如下例子:

In [1]:
import numpy as np

a = np.ones((3,3,3))
b = a.copy()
c = a.flatten()
d = b.ravel()
In [2]:
a
Out[2]:
array([[[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]],

       [[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]],

       [[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]]])
In [3]:
b
Out[3]:
array([[[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]],

       [[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]],

       [[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]]])
In [4]:
c
Out[4]:
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
In [5]:
d
Out[5]:
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
In [6]:
c == d  # c与d相等
Out[6]:
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True])
In [7]:
c is d   # c不是d
Out[7]:
False
In [8]:
c[0] = 100
d[0] = 100
In [9]:
c
Out[9]:
array([100.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,
         1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,
         1.,   1.,   1.,   1.,   1.])
In [10]:
d
Out[10]:
array([100.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,
         1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,
         1.,   1.,   1.,   1.,   1.])
In [11]:
a   # 修改c的元素,a的值不变
Out[11]:
array([[[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]],

       [[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]],

       [[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]]])
In [12]:
b  # 修改d的元素,b的值也发生了变化
Out[12]:
array([[[100.,   1.,   1.],
        [  1.,   1.,   1.],
        [  1.,   1.,   1.]],

       [[  1.,   1.,   1.],
        [  1.,   1.,   1.],
        [  1.,   1.,   1.]],

       [[  1.,   1.,   1.],
        [  1.,   1.,   1.],
        [  1.,   1.,   1.]]])


你可能感兴趣的:(Numpy中flaten()与ravel()的区别)