2016-06-16 2 views
-1

Numpy에서 마스크가 작동하는 방식을 정말 모르겠다.numpy에서 정사각형 마스크를 생성하고 적용하는 방법

나는 그럼 난 그것을 내가 다른 몇 가지를 시도

>>>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]]) 

뭔가를했습니다했다 기다리고 있었다 무엇을

>>>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]]) 

를 사용하려고

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 

같은 마스크를 만들 함수의 버전. 나는 단지 원하는 행동을 취할 수 없다. 내가 도대체 ​​뭘 잘못하고있는 겁니까. 2D 매트릭스가 2D 매트릭스를 어떻게 인덱스하는지 실제로 이해하지 못합니다.

+1

당신의 모든 게시물 수를 당신의 코드? 현재'make_mask' 함수는'center_x' 또는'center_y'를 정의하지 않으며 제공되는대로 작동하지 않습니다. 'center_x'와'center_y'가'index_x'와'index_y'가되지 않는다면 말입니다. 어느 쪽이든, 당신이 제공 한 방식대로 작동하지 않습니다. –

+1

또한 make_mask 호출에 다섯 번째 매개 변수가 있습니다. – Benjamin

+0

하지만, 당신이 찾고있는 것은 조각 표기법이라고 생각합니다 : http://stackoverflow.com/questions/509211/explain-pythons-slice-notation. 나는이 링크를 계산할 것이고 이것이 도움이 될 것이라고 믿는다. –

답변

2

마스크가 2, 5 및 8 행을 0으로 설정하고 있습니다. 배열은 마스킹하는 배열과 모양이 같지 않으므로 병합되고 있습니다. 당신이 마스크 트링되는 배열과 같은 크기를 가지고 있으며, 예상되는 결과를 제공

mask = numpy.ones_like(a) 
mask[center_y:center_y + len_y, center_x:center_x + len_x] = 0 

: 난 당신처럼 뭔가 더 기대했던 생각

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

: 그것은이 적용되고있다.

+0

감사. 나는 아직도 파이썬 배열 슬라이스를 이해하지 못한다고 생각한다. – Valarauca

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]]) 

를 얻을 것을 볼 때 당신에게 인덱스가있는 10 × 10 행렬을 2x2 행렬을 사용하면 행렬에있는 모든 값을 더 큰 행렬을 행별로 인덱싱하는 것으로 간주합니다. 그래서 모든 0이있는 두 번째 행, 모두 0 인 다섯 번째 행 및 모두 0이있는 여덟 번째 행을 볼 수 있습니다.

당신이, 당신은 단지 당신이 가지고있는 인덱스를 사용하여 원하는 효과를 얻으려면, 당신도 함수 필요가 없습니다

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.]]) 
관련 문제