numpy 矩阵切片以及深复制和浅复制的了解

矩阵切片

我们对一个一维矩阵切片的很简单,arr[2:4] 代表获取从第3个数到4个数,不包含第5个数

那如果要对矩阵切片呢?其实是同理的

numpy 矩阵切片以及深复制和浅复制的了解_第1张图片

arr8[:2, :2]也就是说是获取2行2列的子矩阵

不过这里有个问题,看下图

numpy 矩阵切片以及深复制和浅复制的了解_第2张图片

就是arr9看起来是和arr8没有任何关系的另外一个矩阵,但是改了arr9,arr8还是变了,这是怎么回事

在numpy中,为了提高效率,这种切片出来的子矩阵其实都是原矩阵的引用而已,所以改变子矩阵,原矩阵还是会变的

这时候怎么办呢

numpy 矩阵切片以及深复制和浅复制的了解_第3张图片

arr10是arr8的浅复制,这时候你就会发现,arr10的变化并不会影响到arr8的数值变化,200并没有变成100

那这里就要讲到深复制和浅复制的定义了

浅复制,说白了就是复制一部分,只复制了父对象,子对象就还是引用状态

numpy 矩阵切片以及深复制和浅复制的了解_第4张图片

arr12是arr11的浅复制,这时候如果修改arr12里面的[3,5,2]这个子对象里面的数值,arr11还是会跟着变,因为[3,5,2]这个子对象还是属于引用

arr13是arr11的深复制,意思就是全部复制,不管是父对象还是子对象,都全部复制过来,这时候arr13和arr11就是真正的两个没有任何关联的变量,随意操作arr13都不会改变arr11

回到刚刚的话题,看起来,我们的矩阵里面不也包含着类似arr11那样的子对象么,其实对于numpy矩阵来说,里面数据都是子元素,所以浅复制的时候已经把这些子元素都复制过去,所以这时候复制的变量arr10怎么改变子元素都不会改变arr8的

你可能感兴趣的:(python)