浅复制:主要有两种方式,简单的赋值或者使用视图(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]])