本节书摘来自异步社区《Python数据分析》一书中的第2章,第2.7节,作者【印尼】Ivan Idris,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.7 创建数组的视图和拷贝
在介绍ravel()函数的示例中,我们提到了视图的概念。不过,请不要与数据库中的视图概念混淆。在NumPy的世界里,视图不是只读的,因为你不可能守着基础数据一动不动。关键在于要知道,当前处理的是共享的数组视图,还是数组数据的副本。举例来说,可以取数组的一部分来生成视图。这意味着,如果先将数组的某部分赋给一个变量,然后修改原数组中相应位置的数据,那么这个变量的值也会随之变化。我们可以根据著名的莱娜(Lena)照片来创建数组,然后创建视图,随后修改它。这里,莱娜肖像的数组是从SciPy函数获得的。
1.创建一份莱娜数组的副本。
acopy = lena.copy()
2.为该数组创建一个视图。
aview = lena.view()
3.通过flat迭代器将视图中所有的值全部设为0``。
aview.flat = 0
最后,只有一幅图片可以看到该模特,而另一幅图片根本看不到她的影子,如图2-4所示。
下面的代码(为了节约版面,这里没有注释,完整代码请看copy_view.py文件)很好地展示了数组的视图和副本的特点。
import scipy.misc
import matplotlib.pyplot as plt
lena = scipy.misc.lena()
acopy = lena.copy()
aview = lena.view()
plt.subplot(221)
plt.imshow(lena)
plt.subplot(222)
plt.imshow(acopy)
plt.subplot(223)
plt.imshow(aview)
aview.flat = 0
plt.subplot(224)
plt.imshow(aview)
plt.show()
可见,在程序结束部分修改视图,同时改变了原来的莱娜数组。这导致3副图片全部变蓝(如果阅读的是本书的印刷版,也可能显示为黑色),而复制的数组则没有任何变化。所以一定要记住:视图不是只读的。