如何在numpy中生成并应用方形蒙版

时间:2016-06-16 13:04:51

标签: python python-2.7 numpy

我真的无法理解Numpy中的面具是如何工作的。

我创建了一个像

这样的面具
import numpy
def make_mask(center_x,center_y,len_x,len_y):
      x,y = numpy.ogrid[:len_x, :len_y]
      mask = (center_x-x)**2 + (center_y-y)**2
      return mask

然后我尝试使用它

 >>>a = numpy.ones((10,10))
 >>>mask = make_mask(2,2,2,2,2)
 >>>a[mask] = 0
 >>>a
 array([[1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [0,0,0,0,0,0,0,0],
        [1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [0,0,0,0,0,0,0,0],
        [1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [0,0,0,0,0,0,0,0]])

我期待的是像

 >>>a
 array([[1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [1,1,0,0,1,1,1,1],
        [1,1,0,0,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1],
        [1,1,1,1,1,1,1,1]])

我尝试了几个不同版本的功能。我无法获得理想的行为。我究竟做错了什么。我真的不明白2D矩阵如何索引2D矩阵。

2 个答案:

答案 0 :(得分:2)

你的面具将第2行,第5行和第8行设置为0;数组被压平,因为它的形状与它掩盖的数组不同。它被应用为:

ifconfig

我认为你期待的更像是:

a[2] = 0
a[5] = 0
a[8] = 0

与你要掩盖的数组大小相同,并给出预期的结果。

答案 1 :(得分:0)

如果你看一下你的make_mask函数的作用,那么这样写的是:

def make_mask(index_x,index_y,len_x,len_y):
      x,y = numpy.ogrid[:len_x, :len_y]
      mask = (index_x-x)**2 + (index_y-y)**2
      return mask

你会看到你得到了

array([[8, 5],
       [5, 2]])

当你使用那个2x2矩阵索引10x10矩阵时,我相信它会将该矩阵中的所有值视为按行索引较大的矩阵。这就是为什么你看到全部为零的第二行,全部为零的第五行和全部为零的第8行。

为了获得你想要的效果,你可以使用你拥有的指数,你甚至不需要一个功能:

a[startx:startx+lenx, starty:starty+leny] = 0

给出:

array([[ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  0.,  0.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  0.,  0.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.]])