Es gibt Zeiten, in denen ich ein MATLAB-Programm ungefähr einmal im Jahr nach Python portieren muss, aber ich werde die Tipps und Vorsichtsmaßnahmen zusammenfassen, die ich damals bemerkt habe. Wird jederzeit hinzugefügt. (Das Folgende enthält offizielle NumPy / SciPy-Dokumentation zu Unterschieden zu MATLAB Und Numpy für MATLAB-Benutzer enthält viele Duplikate.)
Die Transposition der Matrix M ist M'in MATLAB und M.T in NumPy.
Die Operation [A B] für die Arrays A, B in MATLAB entspricht numpy.hstack ([A, B]) in NumPy. (A und B müssen außer in der letzten Dimension dieselbe Größe haben.)
size() Die Größe jeder Dimension von Array A wird durch die Größe (A) in MATLAB, aber durch numpy.shape (A) in NumPy berechnet. Beachten Sie, dass numpy.size (A) die Anzahl der in Array A enthaltenen Elemente ergibt.
Jeder sollte beim Portieren darauf achten, dass der Index eines Elements eines Arrays in MATLAB bei 1 und in NumPy bei 0 beginnt, der Indexunterschied für die ** Dimension ** eines Arrays jedoch auch Du musst vorsichtig sein. Das heißt, die Summe (A, 2) in MATLAB summiert sich entlang der zweiten Dimension des Arrays A, die in NumPy numpy.sum (A, Achse = 1) sein muss.
Die Summe (A) in MATLAB summiert sich entlang der ersten Dimension von Array A, während NumPy alle Elemente von Array A summiert (sofern keine Achse angegeben ist). Daher entspricht ** Summe (A) in MATLAB numpy.sum (A, Achse = 0) in NumPy **. Dieses Verhalten ist für andere Funktionen gleich, die Operationen entlang einer bestimmten Dimension ausführen, z. B. mean (), std (), var (), max (), min ().
In Bezug auf das Obige, wenn Operationen entlang einer bestimmten Dimension mit sum (), mean (), std (), var () usw. in MATLAB und NumPy ausgeführt werden, um festzustellen, welche Dimension das resultierende Array hat. Es gibt Unterschiede und Sie müssen vorsichtig sein. Wenn Sie beispielsweise berechnen möchten, dass "ein Durchschnitt entlang der zweiten Dimension eines dreidimensionalen Arrays A genommen und vom ursprünglichen Array subtrahiert wird", können Sie ihn mit A --mean (A, 2) in MATLAB, aber mit NumPy finden. A --- numpy.mean (A, 1) gibt einen Fehler aus. Dies ist ** das Ergebnis des Mittelwerts (A, 2) in MATLAB ist ein dreidimensionales Array (die Größe der gemittelten Dimension ist 1), während das Ergebnis von numpy.mean (A, 1) in NumPy ist Dies liegt daran, dass das Ergebnis ein zweidimensionales Array ist (die gemittelte Dimension wird gelöscht) **, sodass eine Subtraktion vom dreidimensionalen Array (im Allgemeinen) nicht möglich ist. In diesem Fall muss in NumPy die gelöschte Dimension explizit durch numpy.newaxis als A --numpy.mean (A, 1) [:, numpy.newaxis,:] ergänzt werden.
reshape() Wenn Sie nur die Form ändern möchten, ohne die Elemente des Arrays zu ändern, verwenden Sie reshape (). Wenn Sie beispielsweise das Array A als [1, 2, 3, 4] in ein zweidimensionales 2x2-Array umordnen möchten, ändern Sie ( A, 2, 2) erzeugt [1 3; 2 4], während NumPy numpy.reshape (A, (2, 2)) [[1, 2], [3, 4] erzeugt. ]] Wird generiert. Mit anderen Worten, ** MATLAB füllt Elemente entlang der ersten Dimension, aber NumPy füllt Elemente entlang der letzten Dimension **. Wenn Sie möchten, dass NumPy Elemente in einer MATLAB-ähnlichen Reihenfolge füllt, müssen Sie in numpy.reshape () die Reihenfolge der Schlüsselwortargumente angeben.
In Bezug auf das Obige gibt die Operation A (:) für das mehrdimensionale Array A in MATLAB einen Spaltenvektor zurück, der alle Elemente von A in einer Dimension neu anordnet, wobei ** MATLAB vom ersten Element ausgeht. Nehmen Sie zuerst die Elemente heraus und ordnen Sie sie entsprechend der ersten Dimension ** an. Andererseits ordnet numPys numpy.ravel (A) auch das mehrdimensionale Array in ein eindimensionales Array um, aber ** NumPy extrahiert zuerst die Elemente aus dem ersten Element entlang der letzten Dimension und ordnet sie an. ** Daher unterscheidet sich die Reihenfolge der Elemente vom Ergebnis von A (:) in MATLAB. Wenn Sie möchten, dass NumPy die Elemente in einer MATLAB-ähnlichen Reihenfolge anordnet, müssen Sie in numpy.ravel () die Reihenfolge der Schlüsselwortargumente angeben.
zeros(), ones() Nullen (n) in MATLAB erzeugen ein zweidimensionales Array der Größe n x n und alle Elemente haben Nullwerte, während numPys numpy.zeros (n) ein eindimensionales Array der Größe n erzeugt. Daher entsprechen ** Nullen (n) in MATLAB numpy.zeros ((n, n)) in NumPy ** (beachten Sie, dass die Form des generierten Arrays als Taple angegeben werden muss). ). Wenn zwei oder mehr Argumente vorhanden sind, verhalten sich sowohl MATLAB als auch NumPy gleich. Das heißt, beide Nullen (m, n) in MATLAB und numpy.zeros ((m, n)) in NumPy erzeugen ein zweidimensionales Array der Größe m x n. Dieses Verhalten ist für diejenigen () gleich.
rank() Der Rang der Matrix M wird in MATLAB nach Rang (M) berechnet, in NumPy jedoch nach numpy.linalg.matrix_rank (M). Beachten Sie, dass numpy.rank (M) die Anzahl der Dimensionen des Arrays M ergibt (dh M.ndim, dh len (M.shape)).
eig() Der Eigenwert der Matrix M wird in MATLAB durch eig (M), in NumPy jedoch durch numpy.linalg.eigvals (M) ermittelt. Beachten Sie, dass Sie bei Verwendung von numpy.eig (M) zusätzlich zu dem Vektor mit dem Eigenwert als Element gleichzeitig die Matrix mit dem Eigenvektor in der Spalte erhalten (w, V = numpy.eig (M), der Vektor w ist der Eigenwert, Die Matrix V ist der Eigenvektor. Selbst in MATLAB können Sie, wenn Sie zwei Rückgabewerte von eig (M) erhalten, Eigenwerte und Eigenvektoren erhalten. In diesem Fall eine Matrix mit Eigenvektoren als Spalten und eine diagonale ** Matrix mit Eigenwerten als diagonale Komponenten ** Es ist zu beachten, dass es in Form von ([V, D] = eig (M), Matrix V ist der Eigenvektor und Matrix D ist der Eigenwert) empfangen wird.
svd() Für die Singularitätszerlegung der Matrix M verwendet MATLAB svd (M) und NumPy numpy.linalg.svd (M). Wenn Sie in MATLAB drei Rückgabewerte erhalten, erhalten Sie die Matrizen U, S, V, wobei S eine Matrix mit Singularwerten als diagonale Elemente ist und U, V Matrizen mit linken bzw. rechten Singularvektoren in Spalten sind. .. Die Arrays u, d, v werden aus NumPys svd (M) erhalten, wobei u eine Matrix mit linken Singularvektoren in Spalten ist, d ein ** eindimensionales Array ** mit Singularwerten als Elemente ist und v ein rechter Singularvektor ist. Ist eine ** Matrix mit ** Zeilen. Mit anderen Worten, U in MATLAB und u in NumPy stimmen überein, aber die anderen stimmen nicht überein, S entspricht numpy.diag (d) und V entspricht der Translokation von v (hermeet-Translokation im Fall einer komplexen Matrix). ..
cov() Eine Funktion, die die Kovarianz zwischen Variablen aus einer multivariablen Datenmatrix berechnet, in MATLAB und NumPy jedoch die Zeilen- und Spalteninterpretationen der Datenmatrix umgekehrt. Das heißt, in MATLAB entspricht jede ** Spalte ** jeder Variablen, in NumPy entspricht jede ** Zeile ** jeder Variablen. Daher entspricht MATLAB cov (X) NumPys numpy.cov (X.T).
linspace(a, b, n) Es verhält sich in MATLAB und NumPy fast gleich, mit dem Unterschied, dass MATLAB b zurückgibt, wenn n 1 ist, aber NumPy a zurückgibt.
Es gibt verschiedene Möglichkeiten, eine MATLAB-Struktur in Python darzustellen, aber ich denke, es ist oft bequem, das strukturierte Array von NumPy zu verwenden. Beachten Sie jedoch, dass MATLAB-Strukturen Felder dynamisch hinzufügen können, während das strukturierte Array von NumPy beim Deklarieren alle Felder definieren muss.
Die Operation [S.f] auf dem Feld f der Struktur S in MATLAB entspricht S ['f'] auf dem Feld f des strukturierten Arrays S von NumPy. Wenn S ['f'] jedoch ein mehrdimensionales Array ist, muss es numpy.hstack (S ['f']) sein (dh das Array für die erste Dimension und in Richtung der letzten Dimension zerlegen. Wieder beitreten).
Recommended Posts