Tipps und Vorsichtsmaßnahmen beim Portieren von MATLAB-Programmen nach Python

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

Translokation

Die Transposition der Matrix M ist M'in MATLAB und M.T in NumPy.

[A B] für die Sequenzen A, B.

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.

Index des Arrays

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.

Funktionen, die Operationen entlang einer bestimmten Dimension ausführen (sum (), mean (), std (), var (), max (), min (), ...)

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 ().

Größe / Form des Arrays nach Anwendung der Funktion

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.

A (:) für Sequenz A.

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.

Struktur

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.

[・] Für die Struktur

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

Tipps und Vorsichtsmaßnahmen beim Portieren von MATLAB-Programmen nach Python
Vorsichtsmaßnahmen beim Übergeben von def an sortierte und gruppierte Funktionen in Python? ??
Portieren und Ändern des Doublet-Solvers von Python2 auf Python3.
[Python] Vorsichtsmaßnahmen beim Zuweisen von Werten zu mehrdimensionalen Arrays
Python- und Numpy-Tipps
Vorsichtsmaßnahmen für das TensorFlow-Upgrade (auf 1.3)
~ Tipps für Python-Anfänger mit Liebe von Pythonista ③ ~
Lernen Sie die Grundlagen und Tipps der kanonischen Python-Ausdrücke von Grund auf neu
Tipps zum Codieren kurz und einfach in Python zu lesen
Vorsichtsmaßnahmen bei der Eingabe von CSV mit Python und der Ausgabe an json, um exe zu erstellen
Rufen Sie Matlab von Python zur Optimierung auf
Python 3.6 unter Windows ... und zu Xamarin.
Vorsichtsmaßnahmen bei der Verwendung von Pit mit Python
[Einführung in Python3 Tag 1] Programmierung und Python
Vorsichtsmaßnahmen bei der Verwendung von Codecs und Pandas
Tipps, wenn Vimmer zu Pycharm wechselt
Tipps zum Programmieren von Wettbewerben mit Python2 (Andere Sprachspezifikationen)
Umgang mit Fehlern bei der Installation von Python und Pip mit Choco
Vorsichtsmaßnahmen beim Erstellen eines Python-Generators
Python-Protokollierung und Dump an JSON
Selen und Python zum Öffnen von Google
Vorsichtsmaßnahmen bei der Verwendung von Phantomjs aus Python
Vorsichtsmaßnahmen beim Festlegen von Standardwerten für Argumente in Python-Funktionsdefinitionen
Vorsichtsmaßnahmen bei Verwendung von sechs mit Python 2.5
Versuchen Sie, Python-Code zu schreiben, um Go-Code zu generieren. - Versuchen Sie, JSON-to-Go usw. zu portieren
Vorsichtsmaßnahmen und Fehlerbehandlung beim Aufrufen der .NET-DLL aus Python mit Pythonnet
Von Python bis zur Verwendung von MeCab (und CaboCha)
[Python] Verwenden Sie und und oder beim Erstellen von Variablen
Tipps, um das Lesen von Python-Hördokumenten zu vereinfachen
So installieren und verwenden Sie pandas_datareader [Python]
Vorsichtsmaßnahmen beim Beizen einer Funktion in Python
Binden Sie Methoden an Python-Klassen und -Instanzen
Zu beachtende Punkte bei der Lösung von DP-Problemen mit Python
Fraktal zum Erstellen und Spielen mit Python
[Anfänger] Python installieren und Programme ausführen (Windows)
Lesen Sie Python csv und exportieren Sie es nach txt
Python: Verwendung von Einheimischen () und Globalen ()
[Python] Berechnen von MAE und RMSE
Verwendung von Python zip und Aufzählung
Komprimieren Sie Python-Daten und schreiben Sie in SQLite
Verwendung ist und == in Python
Versuchen Sie, das Programm "FORTRAN77 Numerical Computing Programming" auf C und Python zu portieren (Teil 1).
[Python] Vorsichtsmaßnahmen beim Erfassen von Daten durch Scraping und Einfügen in die Liste
Python-Tipps
Tipps für diejenigen, die verwirrt sind, wie man is und == in Python verwendet
Drei Dinge, von denen ich süchtig war, als ich Python und MySQL mit Docker verwendete
Versuchen Sie, das Programm "FORTRAN77 Numerical Computing Programming" auf C und Python zu portieren (Teil 3).
Um zu vermeiden, dass bei der Installation von Django-Toolbelt mit Windows, Heroku und Python3.4 (64 Bit) die Hölle kommt ...
Versuchen Sie, das Programm "FORTRAN77 Numerical Computing Programming" auf C und Python zu portieren (Teil 2).
Dinge, die Sie bei der Verwendung von Python beachten sollten, wenn Sie MATLAB verwenden
Python-Tipps
Python-Tipps
[Tipps] Leicht lesbares Schreiben beim Verbinden von Funktionen in Python
So starten Sie Python (Flask) beim Start von EC2
MessagePack-Versuchen Sie, Java und Python mit RPC zu verbinden
Empfohlene Umgebung und Verwendung bei der Entwicklung mit Python
Ich möchte MATLAB feval mit Python verwenden
So generieren Sie eine Sequenz in Python und C ++
[Einführung in Python3 Tag 12] Kapitel 6 Objekte und Klassen (6.3-6.15)