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()

编橙之家文章,

评论关闭