索引numpy数组#

索引是用于选择数组中条目的术语,例如根据其内容。这又是一个我们无法使用标准列表简单执行但Numpy非常有用的操作。

作为第一个简单示例,我们在这里创建一个1D Numpy数组:

import numpy
measurements = numpy.asarray([1, 17, 25, 3, 5, 26, 12])
measurements
array([ 1, 17, 25,  3,  5, 26, 12])

我们的目标现在是在这个数组中只恢复大于某个阈值的值,例如10。当我们使用简单的Python变量时,可以这样进行比较:

a = 5
b = a > 10
b
False

输出是一个布尔值,取值为TrueFalse。幸运的是,我们可以对Numpy数组做同样的事情:

mask = measurements > 10
mask
array([False,  True,  True, False, False,  True,  True])

我们现在得到的不是单个布尔值,而是一个布尔值的Numpy数组。我们现在可以使用这个数组作为我们数据的掩码,以检索一个只包含掩码值(掩码数组中为True)的新数组。为此,我们再次使用括号(就像选择行和列一样),但使用掩码而不是索引:

measurements[mask]
array([17, 25, 26, 12])

应用于图像#

我们可以在整个图像上执行相同的操作,而不是使用这个简单的1D数组。让我们再次导入blobs图片:

from skimage.io import imread, imshow
from microfilm.microplot import microshow
image = imread("../../data/blobs.tif")
microshow(image);
../_images/86f9061a06b2f20b3ed3ddd41075e98754f485f36a8cd0d44daae4545e43ad8f.png
mask = image > 100
mask
array([[False, False, False, ...,  True,  True,  True],
       [False, False, False, ...,  True,  True,  True],
       [False, False, False, ...,  True,  True,  True],
       ...,
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False]])

现在我们得到了一个填充了布尔值的2D数组。我们甚至可以看一下它(白色值为True):

microshow(mask);
../_images/29271299c49d9eb4cca588ae204cbd4d5cd46e5999a5edbe8d8a97abe9ac905c.png

现在我们可以进行索引以恢复所有高于我们100阈值的像素值:

image[mask]
array([112, 152, 184, ..., 152, 128, 112], dtype=uint8)
len(image[mask])
24969

我们有24969个像素高于阈值。

练习#

为所有像素值高于200的创建一个新掩码。

应用掩码以检索一个包含大于200的数字的新数组。

计算所有大于200的像素的平均值。