Numpy 创建视图和副本

有一个重要的事情我们必须要弄清楚,即我们是在与一个共享的数组视图打交道,还是获得了数组数据的一个副本。例如,一个切片(slice)对应一个视图。这意味着,如果你把一个切片赋值给一个变量,随后改变了切片所在数组中的内容,那么这个变量的值也会改变。我们将用著名的图像Lena创建一个数组,复制该数组,创建一个视图,最后再修改这个视图。

准备工作

必须具备的条件和上一章相同。

具体步骤

创建数组Lena的一个副本和视图。
1. 创建数组Lena的一个副本:

acopy = lena.copy()
  1. 创建数组Lena的一个视图
aview = lena.view()
  1. 利用flat迭代器,把视图中所有的值清零:
aview.flat = 0

最终结果是,只有一幅图像显示的是Lena的肖像,其他几幅图像都被完全删剪掉了。
创建视图和副本

本攻略展示了数组的视图和副本的不同之处,完整代码如下。

import scipy.misc
import matplotlib.pyplot

lena = scipy.misc.lena()
acopy = lena.copy()
aview = lena.view()

# 绘制数组Lena
matplotlib.pyplot.subplot(221)
matplotlib.pyplot.imshow(lena)

# 绘制数组Lena的副本
matplotlib.pyplot.subplot(222)
matplotlib.pyplot.imshow(acopy)

# 绘制数组Lena的视图
matplotlib.pyplot.subplot(223)
matplotlib.pyplot.imshow(aview)

# 改变视图内容后再绘制视图
aview.flat = 0
matplotlib.pyplot.subplot(224)
matplotlib.pyplot.imshow(aview)

matplotlib.pyplot.show()

小结

如你所见,在程序的后半段,通过改变视图的内容,我们改变了原始数组Lena中的内容。这导致有三幅图像会显示为单一的蓝色(如果你只能看到黑白图像,将显示为黑色),只有原始数组的副本不受视图内容改变的影响。一定要牢记,视图不是只读的。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程