Numpy数组视图和副本

《Numpy数组视图和副本》

简介

本文将介绍Numpy中数组视图的概念,正是因为有了数组视图,Numpy的运算速度才会快,相当于不修改原始的数组。而与之对应的就是创建新的数组副本。我们需要知道的是哪些操作创建数组视图,哪些是创建副本,这样有利于加快程序的运算,减少内存的消耗。

视图是指与较大数组共享相同数据的较小数组。因为是共享数据,所以修改小数组中的数据会影响大数组。

数组视图

我们以下面的切片示例来解释:

此时数组b是数组a的视图,它与a共享相同的数据。如果我们修改数组b中的数据,数组a会发生相应的变化:

通过 base 属性,可以访问与之共享的大数组:

如果数组的共享大数组是其本身,则 base 属性为 None :

切片视图

在切片操作中,有些是创建数组视图,有些是创建副本。还好这里有明确的规则:对于基本切片(主要为带冒号的索引切片)将创建视图,而其它的高级切片(比如使用布尔切片等)将创建副本。比如:

有一个简单的方法能够返回整个数组的视图:

转置和重塑视图

在数组操作中,转置和重塑都能返回视图。

转置操作:

重塑操作:

复制数组

前面介绍了使用 [:] 能够复制整个数组,但是有时候我们想重新创建一个相同的数组副本。对副本的修改不会影响到原来的整个数组,那么可以使用 copy 方法:

总结

搞清楚创建视图和副本的操作很重要,有时候稍不注意对原来的数组进行了修改会影响后面的结果,而这样的错误有时候又很难察觉。一个常用点是:当使用冒号切片时,创建的是视图,而不是副本,此时注意修改切片数组会影响到原来整个数组。

点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注