Numpy中扁平化函数ravel()和flatten()的区别
在Numpy中经常使⽤到的操作由扁平化操作,Numpy提供了两个函数进⾏此操作,他们的功能相同,但在内存上有很⼤的不同.
先来看这两个函数的使⽤:
1from numpy import *
2
3 a = arange(12).reshape(3,4)
4print(a)
5# [[ 0 1 2 3]
6# [ 4 5 6 7]
7# [ 8 9 10 11]]
8print(a.ravel())
9# [ 0 1 2 3 4 5 6 7 8 9 10 11]
10print(a.flatten())
11# [ 0 1 2 3 4 5 6 7 8 9 10 11]
可以看到这两个函数实现的功能⼀样,但我们在平时使⽤的时候flatten()更为合适.在使⽤过程中flatten()分配了新的内存,但ravel()返回的是⼀个数组的视图.视图是数组的引⽤(说引⽤不太恰当,因为原数组和ravel()返回后的数组的地址并不⼀样),在使⽤过程中应该注意避免在修改视图时影响原本的数组.这是什么意思咧,我们通过代码来具体解释:
1from numpy import *
2
3 a = arange(12).reshape(3,4)
4print(a)
5# [[ 0 1 2 3]
6# [ 4 5 6 7]
7# [ 8 9 10 11]]
8
9# 创建⼀个和a相同内容的数组b
10 b = a.copy()
11 c = a.ravel()
12 d = b.flatten()
13# 输出c和d数组
14print(c)
15# [ 0 1 2 3 4 5 6 7 8 9 10 11]
16print(d)
17# [ 0 1 2 3 4 5 6 7 8 9 10 11]
18# 可以看到c和d数组都是扁平化后的数组,具有相同的内容
19
20print(a is c)
21# False
22print(b is d)
numpy库常用函数23# False
24# 可以看到以上a,b,c,d是四个不同的对象
25
26# 但因为c是a的⼀种展⽰⽅式,虽然他们是不同的对象,但在修改c的时候,a中相应的数也改变了
27 c[1] = 99
28 d[1] = 99
29print(a)
30# [[ 0 99 2 3]
31# [ 4 5 6 7]
32# [ 8 9 10 11]]
33print(b)
34# [[ 0 1 2 3]
35# [ 4 5 6 7]
36# [ 8 9 10 11]]
37print(c)
38# [ 0 99 2 3 4 5 6 7 8 9 10 11]
39print(d)
40# [ 0 99 2 3 4 5 6 7 8 9 10 11]
通过以上的分析,在实际应⽤中应尽量使⽤flatten()函数,这样避免意外的错误.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论