2013-11-23 5 views
7

Ich habe eine Matrix A, die I wie folgt zu erstellen:numpy Indexerror: zu viele Indizes für Array, wenn Indizieren Matrix mit einem anderen

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

Ich habe eine Matrix Etiketten, die ich so erstellen:

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

ist das, was die beiden Matrizes wie folgt aussehen:

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

wie Sie sehen können, wenn ich alle Spalten auswählen, gibt es keine p roblem

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

Aber wenn ich versuche, eine Spalte I ein Fehler

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

Weiß jemand, warum dies bekommen angeben? Ich bin mir bewusst, dass es bereits ähnliche Fragen gibt, aber keine von ihnen erklärt mein Problem gut genug, noch sind die Antworten hilfreich für mich.

+1

Etiketten 2-d, aber der Index verwendet es, als ob es war 1-d. – seberg

+4

Eigentlich ist auch die erste Indizierung falsch, mit numpy> = 1.8. Sie werden den gleichen Fehler auch dort bekommen. – seberg

Antwort

6

Da labels eine Matrix ist, wenn Sie labels==1 tun, erhalten Sie eine boolesche Matrix der gleichen Form. Dann a[labels==1, :] wird Ihnen nur die erste Spalte mit den Zeilen entsprechend der Übereinstimmung zurückgeben. Beachten Sie, dass Ihre Absicht zu erhalten:

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

nicht erreicht wurde (nur die erste Spalte bekommen), obwohl es für NumPy arbeitete < 1.8 (wie von @seberg darauf hingewiesen).

Um zu bekommen, was Sie möchten, eine abgeflachte Ansicht labels verwenden:

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

Schön, ich finde 2D-Arrays besser benommen für die meisten np Arbeit. Mit einem Matlab-Hintergrund verwenden viele Leute die Verwendung von Matrix vs Array. BTW: Ich bekomme das gleiche Verhalten in 1.7. –

+0

labels.view (np.darray) ändert den Typ von 'labels' in np.darray, während der 'ravel'-Aufruf das Array flacht. Hinweis '== 1' kann weggelassen werden –

Verwandte Themen