[英]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.