对于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.]]])