浅复制:主要有两种方式,简单的赋值或者使用视图(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]])
手机扫一扫
移动阅读更方便
你可能感兴趣的文章