2012-09-15 8 views
7

Dato un array di numpy 2D, vale a dire;Modifica locale della matrice numpy mediante l'indicizzazione booleana

import numpy as np 

data = np.array([ 
    [11,12,13], 
    [21,22,23], 
    [31,32,33], 
    [41,42,43],   
    ]) 

Ho bisogno di modificare un sub-array in base a due vettori di mascheramento per le righe e le colonne desiderate;

rows = np.array([False, False, True, True], dtype=bool) 
cols = np.array([True, True, False], dtype=bool) 

Tale che vale a dire;

print data 

#[[11,12,13], 
# [21,22,23], 
# [0,0,33], 
# [0,0,43]]  

risposta

5

Now che si sa come accedere alle righe/cols che volete, appena assigne il valore che si desidera la vostra sottoarray. E 'un po' più complicato, però:

mask = rows[:,None]*cols[None,:] 
data[mask] = 0 

La ragione è che, quando si accede al sottoarray come data[rows][:,cols] (come illustrato nella tua previous question, stiamo prendendo una vista di una visione, e alcuni riferimenti ai dati originali ottenere perso nel modo.

Invece, qui si costruisce una matrice booleana 2D trasmettendo le vostre due array 1D rows e cols uno con l'altro. la vostra serie mask ha ora la forma (len(rows),len(cols). possiamo usare mask per accedere direttamente l'originale articoli di data e li abbiamo impostati su un nuovo valore. a quando lo si fa data[mask], si ottiene un array 1D, che non era la risposta desiderata nel proprio previous question.

Per costruire la maschera, avremmo potuto utilizzare l'operatore & invece di * (perché abbiamo a che fare con gli array booleani), o la semplice funzione di np.outer:

mask = np.outer(rows,cols) 

Modifica: puntelli per @Marcus Jones per la soluzione np.outer.

+1

Fa il lavoro, ma che ne dici di "mask = np.outer (rows, cols)"? –

+1

C'è un modo per ottenere una vista dall'indicizzazione booleana? Quanto sopra funziona solo perché numpy tratta l'assegnazione in modo diverso. 'data [mask]' non è ancora una vista. –

Problemi correlati