有一个重要的事情我们必须要弄清楚,即我们是在与一个共享的数组视图打交道,还是获得了数组数据的一个副本。例如,一个切片(slice)对应一个视图。这意味着,如果你把一个切片赋值给一个变量,随后改变了切片所在数组中的内容,那么这个变量的值也会改变。我们将用著名的图像Lena创建一个数组,复制该数组,创建一个视图,最后再修改这个视图。
准备工作
必须具备的条件和上一章相同。
具体步骤
创建数组Lena
的一个副本和视图。
1. 创建数组Lena
的一个副本:
acopy = lena.copy()
- 创建数组
Lena
的一个视图
aview = lena.view()
- 利用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
中的内容。这导致有三幅图像会显示为单一的蓝色(如果你只能看到黑白图像,将显示为黑色),只有原始数组的副本不受视图内容改变的影响。一定要牢记,视图不是只读的。