今天下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内存地址不一样。

results matching ""

    No results matching ""