Numpy 高级索引

本章将使用高级索引技术,把图像Lena对角线位置上的数值置零,其效果就是在图像上画出两条交叉的蓝色(或者是黑色)对角线。给图像画叉没什么特别的意思,只是练习的需要。与常规索引不同的是,高级索引不使用整数或切片作为索引值。

具体步骤

从画第一条对角线开始,步骤如下:

  1. 把第一条对角线位置上的数值置零。

为了能把对角线上的值置零,需要把数组的两个索引值xy定义为不同的整数列表:

lena[range(xmax), range(ymax)] = 0   

  1. 把另一条对角线位置上的数值置零。

为了能把另一条对角线上的值置零,需要定义另外一对整数列表,但基本原理是一样的:

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()

小结

我们把数组的索引值xy分别定义为单独的整数列表。这两个整数列表被用作数组Lena的索引。高级索引的实现基于一个内部的NumPy迭代器对象,具体执行过程包括三个步骤。

  1. 创建迭代器对象。

  2. 把迭代器对象绑定到数组。

  3. 通过迭代器访问数组元素。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程