2016-01-19 8 views

risposta

8

Quando vengono assegnati più array booleani all'indice, NumPy accoppia gli indici dei valori True. Il primo valore vero in first in abbinamento al primo valore vero in second e così via. NumPy quindi recupera gli elementi in ognuno di questi indici (x, y).

Questo significa che two_d[first, second] è equivalente a:

two_d[[0, 1], [3, 4]] 

In altre parole si sta recuperando i valori di indice (0, 3) e l'indice (1, 4); 3 e 9. Nota che se i due array avessero numeri diversi di valori veri, sarebbe stato generato un errore!

Il documents on advanced indexing menzione questo comportamento brevemente e suggeriscono np.ix_ come alternativa 'meno sorprendente':

Combinazione di più array booleano indicizzazione o un booleana con una matrice intera indicizzazione può essere meglio compresa con l'obj.nonzero() analogia. La funzione ix_ supporta anche gli array booleani e funzionerà senza sorprese.

Quindi si può essere alla ricerca di:

>>> two_d[np.ix_(first, second)] 
array([[3, 4], 
     [8, 9]]) 
+0

per ottenere ciò che presumo si voleva ottenere, è possibile utilizzare two_d [primo] t [secondo] .T – pixelbrei

+0

@pixelbrei: sì che potrebbe lavorare qui, anche se i documenti suggeriscono di usare 'np.ix_' a ottieni il risultato desiderato –

+0

@ajcr Grande, grazie! – user3763302

1

Controllare il documentation on boolean indexing.

two_d[first, second] è lo stesso
two_d[first.nonzero(), second.nonzero()], dove:

>>> first.nonzero() 
(array([0, 1]),) 
>>> second.nonzero() 
(array([3, 4]),) 

Usato come indici, questo selezionerà 3 e 9 in quanto

>>> two_d[0,3] 
3 
>>> two_d[1,4] 
9 

e

>>> two_d[[0,1],[3,4]] 
array([3, 9]) 

anche mildy corrispondenti : NumPy indexing using List?