对于numpy中的array进行操作的时候,可以三种复制方式。
1.浅拷贝
2.视图方式(view)
3.深拷贝(copy)
1.浅拷贝
直接进行赋值的方式,没有新对象的构造,两次创建的变量是指向相同的内存区域的。
import numpy as np
a = np.arange(50)
b = a
print(id(a), id(b))
利用id()验证之后,发现a和b是指向相同内存区域的,只是换了一个名字。
import numpy as np
a = np.arange(50)
b = a.reshape((5, 10))
print(id(a), id(b))
利用id()验证之后,发现结果是不一样的。
注意:id() 函数用于获取对象的内存地址。
import numpy as np
a = np.arange(50)
b = a.reshape((5, 10))
print(b is a)
print(b.base is a)
输出结果是False True,ndarray.base可以返回该数组的基础对象(如果这个数组的内存是来源于其他对象的话)
import numpy as np
a = np.arange(50)
b = a.reshape((5, 10))
print(np.may_share_memory(a, b))
输出结果是True,也就是说a和b是共享内存。
import numpy as np
a = np.arange(50)
b = a.reshape((5, 10))
print(a.flags['OWNDATA'])
print(a.flags.owndata)
print(b.flags['OWNDATA'])
print(b.flags.owndata)
输出结果是True True False False。
内存地址(id)为什么是不一样的,但是他们之间是共享内存的?
\quad
对于对象a和对象b,可以理解为存储了指向同一块内存区域的地址,因为对象a和对象b是共享内存的,所以如果其中一个对象对数据进行改变,另外一个对象输出数据后也会发生改变。而且对象b是通过对象a构造出来的,所以对于b而言,base属性是指向a的。
\quad
但是对象a和对象b本身存储的地址是不一样的,相当于是构建了一个不一样的指针,所以使用id进行判断的时候是不同的。
2.视图方式
对于一块内存区域而言,其中的数据类型是不固定,只是对于这个内存区域数据的视图方式是不同的。例如,如果对象a指向一个内存区域的一组数据,其表达的数据类型是整型,我们可以通过创建一个对象b指向对象a数据的不同试图,比如用浮点数方式进行创建。
3.深拷贝
参考链接:
1.https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.ndarray.base.html
2.https://blog.csdn.net/Jfuck/article/details/9464959
3.https://blog.csdn.net/qq_37553899/article/details/78793226