我们有两种类似的方法将 ndarray 转换为一维数组:Flatten() 和 Ravel()
import numpy as np
a = np.array( [ (1,7,3,4),(3,2,4,1) ] )
#OUTPUT:
print( a.flatten() )
# [ 1,7,3,4,3,2,4,1 ]
print ( a.ravel() )
# [ 1,7,3,4,3,2,4,1 ]
问题出现在这里,为什么有两个 numpy 函数来完成相同的任务?
Flatten() 和 Ravel() 的区别
a.ravel() :
(i) 只返回原始数组的引用/视图
(ii) 如果您修改数组,您会注意到原始数组的值也会发生变化。
(iii) Ravel 比 flatten() 快,因为它不占用任何内存。
(iv) Ravel 是库级函数。
a.flatten() :
(i) 返回原始数组的副本
(ii) 如果修改这个数组的任何值,原数组的值不受影响。
(iii) Flatten() 相对来说比 ravel() 慢,因为它占用内存。
(iv) Flatten 是一个 ndarray 对象的方法。
让我们看看这段代码的区别
# Python code to differentiate
# between flatten and ravel in numpy
import numpy as np
# Create a numpy array
a = np.array([(1,2,3,4),(3,1,4,2)])
# Let's print the array a
print ("Original array:\n ")
print(a)
# To check the dimension of array (dimension =2)
# ( and type is numpy.ndarray )
print ("Dimension of array-> " , (a.ndim))
print("\nOutput for RAVEL \n")
# Convert nd array to 1D array
b = a.ravel()
# Ravel only passes a view of
# original array to array 'b'
print(b)
b[0]=1000
print(b)
# Note here that value of original
# array 'a' at also a[0][0] becomes 1000
print(a)
# Just to check the dimension i.e. 1
# (and type is same numpy.ndarray )
print ("Dimension of array->" ,(b.ndim))
print("\nOutput for FLATTEN \n")
# Convert nd array to 1D array
c = a.flatten()
# Flatten passes copy of
# original array to 'c'
print(c)
c[0]=0
print(c)
# Note that by changing
# value of c there is no
# affect on value of original
# array 'a'
print(a)
print ("Dimension of array-> " , (c.ndim))
OUTPUT:
Original array:
[[1 2 3 4]
[3 1 4 2]]
Dimension of array-> 2
Output for RAVEL
[1 2 3 4 3 1 4 2]
[1000 2 3 4 3 1 4 2]
[[1000 2 3 4]
[ 3 1 4 2]]
Dimension of array-> 1
Output for FLATTEN
[1000 2 3 4 3 1 4 2]
[0 2 3 4 3 1 4 2]
[[1000 2 3 4]
[ 3 1 4 2]]
Dimension of array-> 1