【Numpy学习】Numpy中ravel()和flatten()的区别

函数介绍:ravel和flatten是展平函数具体请看代码

import numpy as np
b = np.arange(24).reshape(2,3,4)
b
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
b.ravel()
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
b.flatten()
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])

从代码上看ravel和flatten都是把多维数组展平变为一维数组的函数它们差别不大,但是具体来说ravel是原数据的一个视图(也可以理解为原来数据的引用,这么说便于理解真实情况下它们没有啥关系),对使用ravel处理后的数据对其进行修改原来的数据也会发生改变。与其对应的flatten就不是这样的它是新建立了一个存储空间存储展平之后的数据,对其做操作不会影响原数据。这是什么意思呢具体请见代码解释:

from numpy import *

a = arange(12).reshape(3,4)
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

# 创建一个和a相同内容的数组b
b = a.copy()
c = a.ravel()
d = b.flatten()
# 输出c和d数组
print(c)
# [ 0  1  2  3  4  5  6  7  8  9 10 11]
print(d)
# [ 0  1  2  3  4  5  6  7  8  9 10 11]
# 可以看到c和d数组都是扁平化后的数组,具有相同的内容

print(a is c)
# False
print(b is d)
# False
# 可以看到以上a,b,c,d是四个不同的对象

# 但因为c是a的一种展示方式,虽然他们是不同的对象,但在修改c的时候,a中相应的数也改变了
c[1] = 99
d[1] = 99
print(a)
# [[ 0 99  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]
print(b)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]
print(c)
# [ 0 99  2  3  4  5  6  7  8  9 10 11]
print(d)
# [ 0 99  2  3  4  5  6  7  8  9 10 11]

参考资料

你可能感兴趣的:(Python学习,数据挖掘,机器学习,深度学习)