【Numpy使用】numpy中的副本与视图

对于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 Truendarray.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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值