2013-10-03 17 views
26

ich ziemlich neu bin in numpy und ich habe eine harte Zeit zu verstehen, wie aus einem np.array eine Untermatrix mit definierten Spalten und Zeilen zu extrahieren:Numpy Extrakt Submatrix

Y = np.arange(16).reshape(4,4) 

Wenn ich Spalten extrahieren möge/Zeilen 0 und 3 sollte ich habe:

[[0 3] 
[12 15]] 

ich alle reshape Funktionen ausprobiert ... aber nicht herausfinden können, wie dies zu tun. Irgendwelche Ideen?

+3

Nur um zu verdeutlichen, was Sie für Ihre gewünschte Ausgabe fragen, ist Spalten/Zeilen 0 und 3 – JoshAdel

Antwort

35

Geben np.ix_ einen Versuch:

Y[np.ix_([0,3],[0,3])] 

Dies gibt das gewünschte Ergebnis:

In [25]: Y = np.arange(16).reshape(4,4) 
In [26]: Y[np.ix_([0,3],[0,3])] 
Out[26]: 
array([[ 0, 3], 
     [12, 15]]) 
+0

ja das ist es! – user1595929

+2

@ user1595929 Wenn Sie der Meinung sind, dass dies die beste Lösung ist und Ihre ursprüngliche Frage korrekt beantwortet, überprüfen Sie dies bitte als akzeptiert. – JoshAdel

10

Eine Lösung Index ist die Zeilen/Spalten durch Schneiden/schreiten. Hier ist ein Beispiel, wo Sie jede dritte Spalte/Zeile aus dem ersten extrahieren Spalten dauern (das heißt, die erste und vierte Spalte)

In [1]: import numpy as np 
In [2]: Y = np.arange(16).reshape(4, 4) 
In [3]: Y[0:4:3, 0:4:3] 
Out[1]: array([[ 0, 3], 
       [12, 15]]) 

Dies gibt Ihnen die Ausgabe, die Sie gesucht haben.

Weitere Informationen finden Sie unter this page on indexing in NumPy.

+0

Ich mag diese Antwort wegen der Ähnlichkeit der Schreibweise mit Matlab-Notation –

3

Zunächst einmal hat Ihre Y nur 4 Spalten und Zeilen, also gibt es keine Spalte4 oder Zeile4, höchstens Spalte3 oder Zeile3.

Um 0 zu erhalten, 3 cols: Y[[0,3],:] 0, erhalten 3 Reihen: Y[:,[0,3]]

So das Array Sie anfordern zu erhalten: Y[[0,3],:][:,[0,3]]

Beachten Sie, dass, wenn Sie Y[[0,3],[0,3]] es nur zu [Y[0,0], Y[3,3]] entspricht und das Ergebnis wird von zwei Elementen sein: array([ 0, 15])

4

Sie auch diese verwenden können:

Y[[[0],[3]],[0,3]] 

, die zu tun dies mit Indizierung Arrays entspricht:

idx = np.array((0,3)).reshape(2,1) 
Y[idx,idx.T] 

Um die Sende Arbeit zu machen, wie gewünscht, müssen Sie die Nicht-Singleton Dimension Ihrer Indizierung Array mit der Achse ausgerichtet werden Sie die Indizierung in , z.B für einen m 2D-Subarray n x:

Y[<n x 1 array>,<1 x m array>] 

Diese schaffen eine Zwischen Array, im Gegensatz zu CT Zhus Antwort, die das Zwischen Array nicht Y[(0,3),:], dann Indizes in es erstellt.

2
print y[0:4:3,0:4:3] 

ist die kürzeste und am besten geeignete Lösung.