numpy中的浅复制和深复制
阅读原文时间:2023年07月14日阅读:2

  浅复制:主要有两种方式,简单的赋值或者使用视图(view)

  简单的赋值:其实就是制造了一个别名,数组并没有被copy成新的一份,当使用其中一个别名改变数组值的时候,另一个别名对应的值一并改变。  

>>>a = np.arange(12)

a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
b = a
b is a
True
b.shape = 3,4
b
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])

  视图:就是制造了一个原数组的在numpy中定义为view的东西,新视图的base是原数组,区别在于新视图可以和原数组有不同的shape,但当视图的值改变,原数组的值也会发生改变。需要注意的是数组的切片其实就是生成视图的过程。如c = a[:],其实就是生成了和a形状相同的a的view(完全切片)。

>>>a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])

c = a.view
c is a
False
c.base is a
True
c.shape = 12
c[0] = 520
a
array([[520, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])

  深复制:就是制作一份原数组的copy了。

>>>d = a.copy()

d[0][0] = 1314
d
array([[1314, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])