2016-04-01 25 views
2

Ich bin etwas verwirrt über die Auswahl einer Spalte eines NumPy-Array, weil das Ergebnis unterscheidet sich von Matlab und sogar von NumPy-Matrix. Bitte beachten Sie die folgenden Fälle. In Matlab verwenden wir den folgenden Befehl, um einen Spaltenvektor aus einer Matrix auszuwählen.Auswählen einer Spalte eines Arrays

x = [0, 1; 2 3] 
out = x(:, 1) 

Dann wird aus [0; 2], die einen Spaltenvektor ist.

, das Gleiche zu tun mit eine NumPy Matrix

x = np.matrix([[0, 1], [2, 3]]) 
out = x[:, 0] 

Dann ist der Ausgang np.matrix([[0], [2]]) ist, das erwartet wird, und es ist ein Spaltenvektor.

Jedoch im Falle von NumPy Array

x = np.array([[0, 1], [2, 3]]) 
out = x[:, 0] 

Die Ausgabe ist, die 1 np.array([0, 2]) dimensional ist, so ist es nicht ein Spaltenvektor. Meine Erwartung ist, dass es np.array([[0], [2]]) hätte sein sollen. Ich habe zwei Fragen.

1.Warum unterscheidet sich die Ausgabe des NumPy-Array-Falls von der NumPy-Matrix? Das verursacht mir eine Menge Verwirrung, aber ich denke, es könnte einen Grund dafür geben.

2.Um einen Spaltenvektor von einem 2-Dim NumPy Array zu bekommen, dann sollte ich tun, zusätzliche Dinge wie expand_dims

x = np.array([[0, 1], [2, 3]]) 
    out = np.expand_dims(x[:, 0], axis = 1) 
+2

Aufgrund der Funktionsweise von Broadcasting ist es nicht wichtig, ob ein 1-D-Vektor eine Zeile oder eine Spalte ist. Benutze es einfach wie du willst. –

Antwort

3

In MATLAB alles atleast 2 Dimensionen hat. In älteren MATLABs war es 2d, jetzt können sie mehr haben. np.matrix ist dem alten MATLAB nachempfunden.

Was macht MATLAB, wenn Sie eine 3D-Matrix indexieren?

np.array ist allgemeiner. Es kann 0, 1, 2 oder mehr Dimensionen haben.

x[:, 0] 
x[0, :] 

beide wählen eine Spalte oder Zeile aus und geben ein Array mit einer Dimension weniger zurück.

x[:, [0]] 
x[[0], :] 

würde 2D-Arrays mit einer Singleton-Dimension zurückgeben.

In Octave (MATLAB-Klon) Indexierungs inkonsistente Ergebnisse erzeugt, auf der Seite der Matrix abhängig I wählen:

octave:7> x=ones(2,3,4); 
octave:8> size(x) 
ans = 
    2 3 4 

octave:9> size(x(1,:,:)) 
ans = 
    1 3 4 

octave:10> size(x(:,:,1)) 
ans =  
    2 3 

MATLAB/Octave Dimensionen am Ende hinzufügt, und anscheinend sie leicht quetscht auf dieser Seite nach unten, wie Gut.

numpy sortiert die Abmessungen in die andere Richtung und kann am Anfang bei Bedarf Maße hinzufügen. Es ist jedoch konsistent, Singleton-Dimensionen beim Indizieren auszuquetschen.

Die Tatsache, dass numpy eine beliebige Anzahl von Dimensionen haben kann, während MATLAB ein Minimum von 2 hat, ist ein entscheidender Unterschied, der oft MATLAB-Benutzer stolpert. Aber einer ist nicht logischer als der andere. MATLABs Praxis ist mehr eine Frage der Geschichte als allgemeine Prinzipien.

Verwandte Themen