6.5 建立一個masked型別的陣列

張崇明發表於2013-06-29

Masked型別的陣列(Masked陣列)可用來遮蔽資料集中的缺失值和無效值。numpy.ma模組中的MaskedArray類包含一個遮蔽碼(mask)陣列,而且是ndarray的子類。在本攻略中,我們把影像Lena作為資料來源,並且假設影像中的某些資料已被損毀。最後將繪製原始影像、原始影像的對數值、Masked型別的陣列及其對數值。

6.5.1 具體步驟

讓我們開始建立Masked型別的陣列。

  1. 建立遮蔽碼陣列。

    為了建立Masked型別的陣列,需要先指定一個遮蔽碼陣列。隨機生成一個遮蔽碼陣列,陣列元素的取值是0或1的一個隨機數。1

    random_mask = numpy.random.randint
        (0, 2, size=lena.shape)
    

    1. 遮蔽碼陣列是一個布林陣列,因此只需要生成0和1兩個隨機數,分別代表False和True。——譯者注

  2. 建立Masked型別的陣列。

    使用上一步得到的遮蔽碼陣列,建立Masked型別的陣列。

    masked_array = numpy.ma.array
       (lena, mask=random_mask)
    

本攻略的完整程式碼如下。

import numpy
import scipy.misc
import matplotlib.pyplot

lena = scipy.misc.lena()
random_mask = numpy.random.randint(0, 2, size=lena.shape)

matplotlib.pyplot.subplot(221)
matplotlib.pyplot.title("Original")
matplotlib.pyplot.imshow(lena)
matplotlib.pyplot.axis('off')

masked_array = numpy.ma.array(lena, mask=random_mask)
print masked_array

matplotlib.pyplot.subplot(222)
matplotlib.pyplot.title("Masked")
matplotlib.pyplot.imshow(masked_array)
matplotlib.pyplot.axis('off')

matplotlib.pyplot.subplot(223)
matplotlib.pyplot.title("Log")
matplotlib.pyplot.imshow(numpy.log(lena))
matplotlib.pyplot.axis('off')

matplotlib.pyplot.subplot(224)
matplotlib.pyplot.title("Log Masked")
matplotlib.pyplot.imshow(numpy.log(masked_array))
matplotlib.pyplot.axis('off')

matplotlib.pyplot.show()

最終生成的影像如下。

enter image description here

6.5.2 攻略小結

我們把隨機生成的遮蔽碼陣列應用到了一個NumPy陣列上。這樣做的效果是,如果某個陣列元素在遮蔽碼陣列中對應元素的取值為True,則該陣列元素在後續處理中將被忽略。在numpy.ma模組中,有一系列完整的針對Masked陣列的操作。本攻略只展示了怎樣建立一個Masked型別的陣列。

相關文章