2016-06-18 31 views
5

ho il seguente codice in Python (array NumPy o scipy.sparse.matrices), funziona:versione più breve di questo NumPy serie indicizzazione

X[a,:][:,b] 

Ma non sembra elegante. 'a' e 'b' sono maschere booleane 1-D.

'un' ha la stessa lunghezza X.shape [0] e 'b' ha la stessa lunghezza X.shape [1]

Ho provato X[a,b] ma non funziona.

Quello che sto cercando di realizzare è selezionare righe e colonne particolari allo stesso tempo. Ad esempio, seleziona la riga 0,7,8 quindi da quel risultato seleziona tutte le righe dalla colonna 2,3,4

Come rendere questo più breve ed elegante?

+0

.... 'X [a,:, b]'? – Divakar

+0

No, questa è una matrice 2D. – off99555

+0

Stai lavorando con gli array NumPy o le matrici NumPy? – Divakar

risposta

5

Potreste usare np.ix_ per tale broadcasted indexing, in questo modo -

X[np.ix_(a,b)] 

Anche se questo non ci sarà alcun più corto del codice originale, ma si spera che dovrebbe essere più veloce. Questo perché stiamo evitando l'output intermedio come con il codice originale che ha creato X[a,:] con un'affettazione e quindi un altro slicing X[a,:][:,b] per darci l'output finale.

Inoltre, questo metodo dovrebbe funzionare per a e b sia come int e boolean array.

Esempio corsa

In [141]: X = np.random.randint(0,99,(6,5)) 

In [142]: m,n = X.shape 

In [143]: a = np.in1d(np.arange(m),np.random.randint(0,m,(m))) 

In [144]: b = np.in1d(np.arange(n),np.random.randint(0,n,(n))) 

In [145]: X[a,:][:,b] 
Out[145]: 
array([[17, 81, 64], 
     [87, 16, 54], 
     [98, 22, 11], 
     [26, 54, 64]]) 

In [146]: X[np.ix_(a,b)] 
Out[146]: 
array([[17, 81, 64], 
     [87, 16, 54], 
     [98, 22, 11], 
     [26, 54, 64]]) 

prova Runtime

In [147]: X = np.random.randint(0,99,(600,500)) 

In [148]: m,n = X.shape 

In [149]: a = np.in1d(np.arange(m),np.random.randint(0,m,(m))) 

In [150]: b = np.in1d(np.arange(n),np.random.randint(0,n,(n))) 

In [151]: %timeit X[a,:][:,b] 
1000 loops, best of 3: 1.74 ms per loop 

In [152]: %timeit X[np.ix_(a,b)] 
1000 loops, best of 3: 1.24 ms per loop 
+0

Nel mio caso, 'a' e 'b' sono maschere booleane. – off99555

+0

Guarda l'output di 'ix_' per vedere come può essere fatto senza di esso. – hpaulj

+1

'np.ix_' applica' np.nonzero' agli argomenti booleani, convertendoli in indici. – hpaulj

Problemi correlati