2014-09-03 4 views
7

범위가 주어진 경우 인덱스 배열을 1과 0의 배열로 변환 할 수 있습니까? 즉, [2,3] -> [0, 0, 1, 1, 0, 5Numpy에서 인덱스 배열을 마스크 배열로 변환하는 방법은 무엇입니까?

의 범위에서 나는 이런 식으로 뭔가 자동화하기 위해 노력하고있어 :

>>> index_array = np.arange(200,300) 
array([200, 201, ... , 299]) 

>>> mask_array = ???   # some function of index_array and 500 
array([0, 0, 0, ..., 1, 1, 1, ... , 0, 0, 0]) 

>>> train(data[mask_array]) # trains with 200~299 
>>> predict(data[~mask_array]) # predicts with 0~199, 300~499 
+0

scipy에는 마스크 된 어레이 모듈이 있습니다. 그것은 질문과 관련이 있습니다. http://docs.scipy.org/doc/numpy/reference/maskedarray.html –

+0

'[x 범위 (500)의 x에 대한 index_array]'정렬은 수행하지만 대신 'True' 및'False'를 사용합니다. 1 and 0. – genisage

+0

@genisage 답변으로 의견을 말씀해 주시겠습니까? 너를 선택하고 싶다. 그것은 제가 찾고 있던 정확한 것입니다. 답변 감사합니다! – Efreeto

답변

15

여기 하나의 방법을 :

In [1]: index_array = np.array([3, 4, 7, 9]) 

In [2]: n = 15 

In [3]: mask_array = np.zeros(n, dtype=int) 

In [4]: mask_array[index_array] = 1 

In [5]: mask_array 
Out[5]: array([0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0]) 

마스크 범위가 항상 경우 index_array을 제거하고 조각에 1을 할당 할 수 있습니다

In [6]: mask_array = np.zeros(n, dtype=int) 

In [7]: mask_array[5:10] = 1 

In [8]: mask_array 
Out[8]: array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]) 
,536,913,632 대신 정수의 부울 값의 배열을 원하는 경우가 생성 될 때 10

mask_arraydtype 변경 : 요청으로

In [11]: mask_array = np.zeros(n, dtype=bool) 

In [12]: mask_array 
Out[12]: 
array([False, False, False, False, False, False, False, False, False, 
     False, False, False, False, False, False], dtype=bool) 

In [13]: mask_array[5:10] = True 

In [14]: mask_array 
Out[14]: 
array([False, False, False, False, False, True, True, True, True, 
     True, False, False, False, False, False], dtype=bool) 
+0

+1 특히 mask_array가 np.array가되기를 원한다면 아주 좋은 대답입니다. – Efreeto

+0

그리고 목록 이해보다 훨씬 효율적입니다. – JulienD

+0

bool 대신 int를 사용하면 어떤 이점이 있습니까? 나는 왜 질문의 마스크를 물어볼 때 대답의 상단 부분이 bool을 권장하지 않는지 궁금 할뿐입니다. – Annan

-1

, 여기가 답입니다. 코드 : 당신이 질문처럼

[x in index_array for x in range(500)] 

당신에게 마스크를 제공하지만 Bools 대신 0과 1을 사용합니다.

+0

그를 downvote하지 마십시오. 나는 그/그녀에게 대답으로 자신의 의견을 말하도록 요청했다. 그리고 나는이 대답이 downvoted되지 않도록 허용 된 대답을 바꿀 것입니다. – Efreeto

2

단일 차원의 경우, 시도 : 하나 개 이상의 차원에 대한

n = (15,) 
index_array = [2, 5, 7] 
mask_array = numpy.zeros(n) 
mask_array[index_array] = 1 

, 하나의 차원들로 N 차원의 인덱스를 변환 한 후 사용 라벨 :

n = (15, 15) 
index_array = [[1, 4, 6], [10, 11, 2]] # you may need to transpose your indices! 
mask_array = numpy.zeros(n) 
flat_index_array = np.ravel_multi_index(
    index_array, 
    mask_array.shape) 
numpy.ravel(mask_array)[flat_index_array] = 1 
0

멋진있다 또한, 한 - 라이너로이 작업을 수행하는 트릭 - (마지막 줄이 핵심 부분입니다)이 같은 numpy.in1dnumpy.arange 기능을 사용

>>> x = np.linspace(-2, 2, 10) 
>>> y = x**2 - 1 
>>> idxs = np.where(y<0) 

>>> np.in1d(np.arange(len(x)), idxs) 
array([False, False, False, True, True, True, True, False, False, False], dtype=bool) 

이 접근법의 단점은 워렌 위커 세르 (Warren Weckesser)가 준 appropch보다 10 ~ 100 배 더 느리다는 것입니다. 그러나 그것은 하나의 라이너이며, 여러분이 찾고있는 것일 수도 그렇지 않을 수도 있습니다.

관련 문제