本章将使用高级索引技术,把图像Lena对角线位置上的数值置零,其效果就是在图像上画出两条交叉的蓝色(或者是黑色)对角线。给图像画叉没什么特别的意思,只是练习的需要。与常规索引不同的是,高级索引不使用整数或切片作为索引值。
具体步骤
从画第一条对角线开始,步骤如下:
- 把第一条对角线位置上的数值置零。
为了能把对角线上的值置零,需要把数组的两个索引值x
和y
定义为不同的整数列表:
lena[range(xmax), range(ymax)] = 0
- 把另一条对角线位置上的数值置零。
为了能把另一条对角线上的值置零,需要定义另外一对整数列表,但基本原理是一样的:
lena[range(xmax-1,-1,-1), range(ymax)] = 0
在最终得到的图像上,可以看到两条交叉的对角线,如下图所示。
本攻略的完整代码如下。
import scipy.misc
import matplotlib.pyplot
# 通过把对角线上的值置零,演示了高级索引的用法.
# 加载数组Lena
lena = scipy.misc.lena()
xmax = lena.shape[0]
ymax = lena.shape[1]
# 高级索引
# 把对角线位置上的值置零
# x 0-xmax
# y 0-ymax
lena[range(xmax), range(ymax)] = 0
# 把另一条对角线位置上的值置零
# x xmax-0
# y 0-ymax
lena[range(xmax-1,-1,-1), range(ymax)] = 0
# 绘制对角线置零后的图像Lena
matplotlib.pyplot.imshow(lena)
matplotlib.pyplot.show()
小结
我们把数组的索引值x
和y
分别定义为单独的整数列表。这两个整数列表被用作数组Lena
的索引。高级索引的实现基于一个内部的NumPy迭代器对象,具体执行过程包括三个步骤。
-
创建迭代器对象。
-
把迭代器对象绑定到数组。
-
通过迭代器访问数组元素。