numpy中的浅复制和深复制

Posted chester-cs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了numpy中的浅复制和深复制相关的知识,希望对你有一定的参考价值。

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

以上是关于numpy中的浅复制和深复制的主要内容,如果未能解决你的问题,请参考以下文章

clone中的浅复制和深复制

关于Python的浅复制和深复制

也来谈一谈js的浅复制和深复制

JavaScript中对象的浅复制和深复制

js中的浅拷贝和深拷贝

java中的浅克隆和深克隆是啥