索引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
输出是一个布尔值,取值为True或False。幸运的是,我们可以对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);
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);
现在我们可以进行索引以恢复所有高于我们100阈值的像素值:
image[mask]
array([112, 152, 184, ..., 152, 128, 112], dtype=uint8)
len(image[mask])
24969
我们有24969个像素高于阈值。
练习#
为所有像素值高于200的创建一个新掩码。
应用掩码以检索一个包含大于200的数字的新数组。
计算所有大于200的像素的平均值。