我真的无法理解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 :(得分: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.]])