2014-11-09 1 views
0

열 인덱스가 cutoff[i], 0 < = i보다 큰 모든 위치에서 수십만 행 ~ 500 열의 큰 배열을 효율적으로 마스크하려고합니다. < 행 수입니다.열 인덱스가 각 행에 고유 한 특정 컷오프보다 클 때 마스크 배열 항목

In [2]: x = np.random.randint(0,100,size=24).reshape((6,4)); x 
Out[2]: 
array([[86, 50, 19, 49], 
     [41, 80, 94, 50], 
     [36, 58, 66, 50], 
     [67, 45, 76, 18], 
     [80, 14, 10, 30], 
     [25, 90, 44, 38]]) 

In [3]: cutoff = np.array([10,4,3,2,1,0]); cutoff 
Out[3]: array([10, 4, 3, 2, 1, 0]) 

가 지금은 기본적으로 maskmask[:, cutoff:]=True로를 만들려하지만, 물론이 나에게 오류를 제공합니다 : 여기

은 예입니다. 최종 결과 :

[[86 50 19 49] 
[41 80 94 50] 
[36 58 66 --] 
[67 45 -- --] 
[80 -- -- --] 
[-- -- -- --]] 

다음과 같은 빠른 방법이 있습니까?

In [4]: mask = np.zeros_like(x) 

In [5]: for row in range(x.shape[0]): 
    ...:  mask[row, cutoff[row]:] = 1 
    ...: 

In [6]: mask 
Out[6]: 
array([[0, 0, 0, 0], 
     [0, 0, 0, 0], 
     [0, 0, 0, 1], 
     [0, 0, 1, 1], 
     [0, 1, 1, 1], 
     [1, 1, 1, 1]]) 

In [7]: np.ma.array(x, mask=mask) 
Out[7]: 
masked_array(data = 
[[86 50 19 49] 
[41 80 94 50] 
[36 58 66 --] 
[67 45 -- --] 
[80 -- -- --] 
[-- -- -- --]], 
      mask = 
[[False False False False] 
[False False False False] 
[False False False True] 
[False False True True] 
[False True True True] 
[ True True True True]], 
     fill_value = 999999) 

더 쉽고 빠르면 팬더를 사용할 수 있습니다.

답변

2

당신은 방송을 사용할 수 있습니다

다음
cutoff = np.array([10,4,3,2,1,0]) 
np.arange(4)[None, :] >= cutoff[:, None] 

은 결과입니다

array([[False, False, False, False], 
     [False, False, False, False], 
     [False, False, False, True], 
     [False, False, True, True], 
     [False, True, True, True], 
     [ True, True, True, True]], dtype=bool) 

또는 ufunc의 outer() 방법을 사용

np.less_equal.outer(cutoff, np.arange(4)) 
+0

천재 감사를! – mtrbean

관련 문제