2014-09-03 3 views
7

Ist es möglich, ein Array von Indizes in ein Array von Einsen und Nullen zu konvertieren, wenn der Bereich? dh [2,3] -> [0, 0, 1, 1, 0], in Bereich von 5Wie können Sie ein Index-Array in Numpy zu einem Masken-Array machen?

Ich versuche, so etwas zu automatisieren:

>>> 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 hat ein maskiertes Array-Modul. Es hängt mit der Frage zusammen. http://docs.scipy.org/doc/numpy/reference/maskedarray.html –

+0

'[x in index_array für x im Bereich (500)]' Art tut es, aber mit 'True' und' False' anstelle von 1 und 0. – genisage

+0

@genisage Können Sie bitte Ihren Kommentar als Antwort abgeben? Ich möchte deine auswählen. Es ist genau das, wonach ich gesucht habe. Danke für die Antwort! – Efreeto

Antwort

15

Hier ist eine Möglichkeit:

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

Wenn die Maske immer ein Bereich ist, können Sie index_array beseitigen und weisen 1 zu einer Scheibe:

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

Wenn Sie ein Array von Boolesche Werte anstelle von ganzen Zahlen wollen, ändern Sie die dtype von mask_array wenn sie erstellt wird:

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 Dies ist auch eine sehr nette Antwort, besonders wenn jemand möchte, dass sein mask_array ein np.array ist. – Efreeto

+0

Und es ist viel effizienter als das Listenverständnis. – JulienD

+0

Gibt es einen Vorteil, Int statt Bool zu verwenden? Ich frage mich nur, warum der obere Teil der Antwort bool nicht empfiehlt, wenn die Frage nach einer Maske fragt. – Annan

-1

Wie gewünscht, hier in einer Antwort. Der Code:

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

wird Ihnen eine Maske wie Sie gefragt, aber es wird Bools anstelle von 0 und 1 ist.

+0

Bitte nicht ablehnen. Ich bat ihn/sie, seinen/ihren Kommentar als Antwort zu geben. Und ich werde die angenommene Antwort ändern, damit diese Antwort nicht abgelehnt wird. – Efreeto

2

Für eine einzelne Dimension, versuchen:

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

Für mehr als eine Dimension, Ihren n-dimensionalen Indizes in eindimensional diejenigen umwandeln, dann Ravel verwenden:

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

Es gibt ein schönen Trick, dies auch als Einzeiler zu tun - verwenden Sie die numpy.in1d und numpy.arange Funktionen wie folgt (die letzte Zeile ist der Schlüssel Teil):

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

Der Nachteil dieses Ansatzes ist, dass es ~ 10-100x langsamer ist als die Approch, die Warren Weckesser gab ... aber es ist ein Einzeiler, der vielleicht nicht das ist, wonach Sie suchen.

Verwandte Themen