python numpy deep copy相关问题,pythonnumpy,在列表中,b=a[:]和
python numpy deep copy相关问题,pythonnumpy,在列表中,b=a[:]和
在列表中,b=a[:]和b=a.copy()是具有相同效果的,都可以用来deep copy,但是在numpy 数组中两者效果却不同,b=a[:]复制后b仍然随着a的改变而改变,但是两者指向的内存地址却不同,b is a也返回false,这是为什么呢?谢谢!
>>>import numpy as np>>>a=np.arange(4)>>>b=a>>>c=a[:]>>>d=a.copy()>>>a[3]=10>>>id(a)140572616448320>>>id(b)140572616448320 # a,b的指针地址相同>>>id(c)140572616446080>>>id(d)140572616448640 >>>aarray([ 0, 1, 2, 10])>>>barray([ 0, 1, 2, 10])>>>carray([ 0, 1, 2, 10]) # a,c的指针地址不同,变化却是一致的>>>darray([0, 1, 2, 3])
numpy关于copy有三种情况,完全不复制、视图(view)或者叫浅复制(shadow copy)和深复制(deep copy)。
而b = a[:]就属于第二种,即视图,这本质上是一种切片操作(slicing),所有的切片操作返回的都是视图。具体来说,b = a[:]会创建一个新的对象b(所以说 id 和a不一样),但是b的数据完全来自于a,和a保持完全一致,换句话说,b的数据完全由a保管,他们两个的数据变化是一致的,可以看下面的示例:
a = np.arange(4) # array([0, 1, 2, 3])b = a[:] # array([0, 1, 2, 3])b.flags.owndata # 返回 False,b 并不保管数据a.flags.owndata # 返回 True,数据由 a 保管# 改变 a 同时也影响到 ba[-1] = 10 # array([0, 1, 2, 10])b # array([0, 1, 2, 10])# 改变 b 同时也影响到 ab[0] = 10 # array([10, 1, 2, 10])a # array([10, 1, 2, 10])
b = a 和 b = a[:] 的差别就在于后者会创建新的对象,前者不会。两种方式都会导致a和b的数据相互影响。
要想不让a的改动影响到b,可以使用深复制:
unique_b = a.copy()
编橙之家文章,
相关内容
- 请问rc.local配置uwsgi启动不正常,rc.localuwsgi,操作系统:
- Python3.4怎样进入子目录语法是什么?,python3.4语法,比如
- 《Python核心编程》书中关于type的不解,,type(a)== ty
- Python WEB网页selenium截图不完整有什么解决方案吗,pyt
- Flask Web第6章 电子邮件 error: [Errno 111] Connection refused,
- 关于Python函数的一段代码,求大神帮检查下代码问题,
- Python Ubuntu直接播放url链接mp3歌曲用什么库,pythonubunt
- Python程序员有尝试在Android平台设备做开发工作的吗?,
- 一种从没见过的python装饰器求指导,python装饰,求详解,
- 求常量处理基于Flask的Templates方法,flasktemplates,例如:
评论关闭