2013-11-23 17 views
7

ho una matrice a cui Creo simili:IndexError NumPy: troppi indici per la matrice quando indicizzazione matrice con un altro

>>> a = np.matrix("1 2 3; 4 5 6; 7 8 9; 10 11 12") 

Ho un'etichette matrice che creo simili:

>>> labels = np.matrix("1;0;1;1") 

Questo è ciò che i due da matrici assomigliano:

>>> a 
matrix([[ 1, 2, 3], 
     [ 4, 5, 6], 
     [ 7, 8, 9], 
     [10, 11, 12]]) 
>>> labels 
matrix([[1], 
     [0], 
     [1], 
     [1]]) 

come si può vedere, quando seleziono tutte le colonne, non v'è p roblem

>>> a[labels == 1, :] 
matrix([[ 1, 7, 10]]) 

Ma quando provo ad indicare una colonna ottengo un errore

>>> a[labels == 1, 1] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/site-packages/numpy/matrixlib/defmatrix.py", line 305, in  __getitem__ 
    out = N.ndarray.__getitem__(self, index) 
IndexError: too many indices for array 
>>> 

Qualcuno sa perché questo è? Sono consapevole che ci sono già domande simili a questo, ma nessuno di loro spiega bene il mio problema, né le risposte mi sono state utili.

+1

etichette è 2-D, ma l'indice utilizza come se fosse 1-d. – seberg

+4

In realtà, anche la prima indicizzazione è sbagliata, con numpy> = 1.8. otterrai lo stesso errore anche lì. – seberg

risposta

6

Poiché labels è una matrice quando si esegue labels==1 si ottiene una matrice booleana della stessa forma. Quindi, eseguendo a[labels==1, :], si restituirà solo la prima colonna con le righe corrispondenti alla corrispondenza. Si noti che la vostra intenzione di ottenere:

matrix([[ 1, 2, 3], 
     [ 7, 8, 9], 
     [10, 11, 12]]) 

non è stato raggiunto (si ha solo la prima colonna), anche se ha funzionato per NumPy < 1.8 (come sottolineato da @seberg).

al fine di ottenere ciò che si desidera è possibile utilizzare una vista appiattita di labels:

a[labels.view(np.ndarray).ravel()==1, :] 
+1

Bello, trovo che gli array 2D si comportino meglio per la maggior parte dei lavori di np. Con uno sfondo matlab un sacco di persone utilizzano l'array matrix vs. A proposito: ottengo lo stesso comportamento in 1.7. –

+0

labels.view (np.ndarray) cambia il tipo di 'labels' in np.ndarray mentre la chiamata' ravel' appiattisce l'array. Nota '== 1' può essere ommited –

Problemi correlati