[英]How to generate and apply a square mask in 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矩阵。
您的遮罩将第二行,第五行和第八行设置为0; 由于阵列的形状与被遮罩的阵列不同,因此阵列被展平。 它被应用为:
a[2] = 0
a[5] = 0
a[8] = 0
我认为您期待更多类似的东西:
mask = numpy.ones_like(a)
mask[center_y:center_y + len_y, center_x:center_x + len_x] = 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矩阵时,我相信它将矩阵中的所有值视为按行索引较大的矩阵。 这就是为什么看到第二行全为零,第五行全为零,第八行全为零的原因。
为了获得想要的效果,您可以只使用已有的索引,甚至不需要一个函数:
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.]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.