2017-02-01 2 views
2

을 사용하여 3 차원 어레이를 마스킹 난의 형상NumPy와는 np.where() 인덱스

transition = np.where((rain>0) & (snow>0) & (graup>0) & (xlat<53.) & (xlat>49.) & (xlon<-114.) & (xlon>-127.)) #indexes the grids where there are transitions 

여러 조건들에 기초하여 인덱스를 생성 (3,259711) 다음과 같이 표시한다 :

array([[ 0, 0, 0, ..., 47, 47, 47], #hour 
     [847, 847, 848, ..., 950, 950, 951], #lat gridpoint 
     [231, 237, 231, ..., 200, 201, 198]]) #lon gridpoint 

나는 hour, lat, lon에 해당하는 (48, 1015, 1359) 모양을 가진 몇 가지 다른 변수 (예 : temp)를 가지고 있습니다.

인덱스는 내 유효한 격자 점이며, temp와 같은 모든 변수를 마스크하여 (48,1015,1359) 모양을 유지하지만 인덱스 외부의 값은 마스크 처리하는 방법은 무엇입니까?

+0

정확히 mask''무엇을 의미합니까? 어떤 종류의 작전을 위해서? 어떤 경우 마스크 된 배열 ('np.ma') 서브 클래스가 유용 할 수 있습니다. – hpaulj

+0

제안 해 주셔서 감사합니다. numpy.ma.masked_where (idx, temp)를 사용하여 이미 시도했지만 모양에 문제가 있습니다. IndexError : 조건과 입력 (get (3, 259711) 및 (48, 1015, 1359) 사이의 모양이 일치하지 않습니다.) @hpaulj – jdiction

+0

'masked_where'는'where'에 의해 생성 된 인덱스 튜플이 아닌 숨길 값의 부울 마스크를 원합니다. 이'where' 튜플을 생성 한 조건 행렬은 무엇입니까? – hpaulj

답변

0
In [90]: arr = np.arange(24).reshape(6,4) 
In [91]: keep = (arr % 3)==1 
In [92]: keep 
Out[92]: 
array([[False, True, False, False], 
     [ True, False, False, True], 
     [False, False, True, False], 
     [False, True, False, False], 
     [ True, False, False, True], 
     [False, False, True, False]], dtype=bool) 
In [93]: np.where(keep) 
Out[93]: 
(array([0, 1, 1, 2, 3, 4, 4, 5], dtype=int32), 
array([1, 0, 3, 2, 1, 0, 3, 2], dtype=int32)) 

keep 마스크의 간단한 적용은 원하는 값의 1 차원 배열을 제공합니다. 튜플 where으로 색인을 생성 할 수도 있습니다. - 다만 다른 인수 순서

In [95]: np.ma.masked_array(arr,mask=~keep) 
Out[95]: 
masked_array(data = 
[[-- 1 -- --] 
[4 -- -- 7] 
[-- -- 10 --] 
[-- 13 -- --] 
[16 -- -- 19] 
[-- -- 22 --]], 
      mask = 
[[ True False True True] 
[False True True False] 
[ True True False True] 
[ True False True True] 
[False True True False] 
[ True True False True]], 
     fill_value = 999999) 

np.ma.masked_where(~keep, arr)이 같은 일을 수행합니다

In [94]: arr[keep] 
Out[94]: array([ 1, 4, 7, 10, 13, 16, 19, 22]) 
keep

, 또는 오히려 부울 역이야, 나는 마스크 배열을 만들 수 있습니다. 부울 마스크 배열이 여전히 필요합니다.

은 내가 where 튜플로 시작하는 같은 작업을 수행 할 수 있습니다

In [105]: idx = np.where(keep) 
In [106]: mask = np.ones_like(arr, dtype=bool) 
In [107]: mask[idx] = False 
In [108]: np.ma.masked_array(arr, mask=mask) 

하나의 호출이 수행하는 np.ma 클래스에 뭔가가있을 수 있지만, 건설 같은 종류의 작업을 수행해야합니다.

이것은 또한 작동합니다

x = np.ma.masked_all_like(arr) 
x[idx] = arr[idx] 
관련 문제