今天下cs231n课的作业,遇到一个小问题,方法没问题,但是就是一直结果不对,后来排查半天才发现是拷贝引起的问题,所以在下面讲一下浅拷贝与深拷贝,避免再次入坑。
numpy array的赋值
B = A
B[:] = A (same as B[:] = A[:])
B = np.copy(A)
np.copyto(B, A)
第一种是浅拷贝,相当于C++中的引用;
第二种是B之前已经存在,且B的shape和A一致才可以这么使用,属于深拷贝;
第三种是深拷贝,B是新建的变量;
第四种类似第二种,需要B这个变量之前存在,官方文档说可以broadcast,举例来说怎么进行broadcast,如下:
d = np.zeros((2, 4))
a = np.array([1,2,3,4])
np.copyto(d, a)
# d: [[1,2,3,4],[1,2,3,4]]
可以使用
print hex(id(d))
来查看变量d
的内存地址。
注意,下面这种方式
b = a + 0
这不算是拷贝,这是赋值,不过b和a内容相同,但是a,b内存地址不一样。