Ich wollte die Python-Bibliothek von MATLAB verwenden

Einführung

Über diesen Artikel

MATLAB und Python haben jeweils ihre Vorteile. MATLAB ist stark in Matrixoperationen und seine Stärken umfassen japanische Dokumente und die Existenz von Simlink. Auf der anderen Seite ist Python kostenlos zu verwenden und seine umfangreichen Bibliotheken für maschinelles Lernen wie Scicit-Learn sind attraktiv. Daher möchten Sie diese möglicherweise ordnungsgemäß verwenden.

In einem solchen Fall gibt es Möglichkeit, Python direkt von MATLAB aus aufzurufen. (Im Gegenteil, Sie können auch die MATLAB-Funktion von Python aus aufrufen, aber ich werde sie diesmal nicht berühren.)

Selbst wenn ich es nachschlage, ist das offizielle Dokument nicht sehr praktisch [^ Beispiel]. Daher werde ich dieses Mal ** Informationen organisieren und zusammenfassen, die im praktischen Gebrauch nützlich zu sein scheinen **.

Was ich machen wollte

In der Vergangenheit gab es Zeiten, in denen ich den Teil des maschinellen Lernens mit Python verarbeiten und MATLAB verwenden wollte, um Trainingsdaten vorzubereiten und das Modell zu bewerten. Sie konnten den Code in jeder Sprache schreiben und ausführen und die Ergebnisse in einer Dat- oder Mat-Datei austauschen, aber es war ein wenig mühsam. Als ich von dieser Funktion erfuhr, dachte ich: "Ich kann es einfacher machen!" (Eigentlich war die Schlussfolgerung, die ich mir ansah, "** Python-Aufrufe von MATLAB sind nicht wünschenswert **")

[^ Beispiel]: Es gibt nur ein Beispiel für textwrap.wrap, und ich habe keine Ahnung, wie man numpy usw. verwendet. (Ich glaube, ich wollte es nur mit der Standardbibliothek erklären.)

Vorbereitung zur Verwendung von Python

Bevor Sie es mit MATLAB verwenden können, müssen Sie den Python-Interpreter installieren und seinen Pfad registrieren. Da Python jedoch Offizielle Version und Anaconda-Version hat, ändert sich das Verfahren ein wenig. Ich werde.

Um die offizielle Version von Python.org zu verwenden, installieren Sie sie gemäß Erläuterung hier. nur.

Wenn der Pfad jedoch nicht in der Anaconda-Umgebung oder in der offiziellen Version übergeben wird, muss der Pfad in MATLAB einzeln festgelegt werden. Ermitteln Sie zunächst den Pfad des Interpreters, den Sie verwenden möchten. Legen Sie dann den Pfad fest, der von der Funktion [pyversion] überprüft wird (https://jp.mathworks.com/help/matlab/ref/pyversion.html). Um beispielsweise Anacondas "Hogehoge" -Umgebung zu verwenden, schreiben Sie wie folgt.

executable = [getenv('userprofile'),...
     '\AppData\Local\Continuum\anaconda3\envs\hogehoge\python.exe'];
pyversion(executable);
clearvars executable;

Führen Sie "pyversion" ohne Argumente aus, um festzustellen, ob es ordnungsgemäß eingerichtet ist. Wenn die Version angezeigt wird, sollte dies in Ordnung sein.

Mit Python verarbeiten

Rufen Sie eine Python-Funktion auf

Rufen wir als nächstes eine Python-Funktion auf. Um eine Funktion namens "command" in Python von MATLAB aus aufzurufen, verwenden Sie einfach "py.command". Wenn Sie beispielsweise die Python-Druckfunktion ausführen möchten, gehen Sie wie folgt vor.

py.print("Hello world!");

Es ist jedoch zu beachten, dass MATLAB und Python unterschiedliche integrierte Datentypen und Syntax haben. Selbst wenn dies beispielsweise in Python möglich ist, ist die folgende Notation nicht zulässig.

py.print("{0} {1}".format("Hello", "world!"));

%  py.print("{0} {1}".format("Hello", "world!"));
%                    ↑
%Error:Unerwarteter MATLAB-Operator.

Zur ordnungsgemäßen Ausführung [Konvertieren Sie den String-Typ von MATLAB explizit in den String-Typ von Python](https://jp.mathworks.com/help/matlab/matlab_external/handling-data-returned-from- python.html) Sie müssen es tun.

py.print(py.str("{0} {1}").format("Hello", "world!"));

So importieren Sie

Weiter zum Thema So importieren Sie Python-Pakete. Die obige Seite beschreibt das Syntaxäquivalent von "from x import y" in Python. In der Praxis wird jedoch häufig eine Syntax wie "import numpy as np" verwendet. Dies kann wie folgt aus [Implementierung der Importanweisung] auf der Python-Seite (https://docs.python.org/ja/3/library/importlib.html) geschrieben werden.

%Code, der dem Import von numpy als np in Python entspricht
np = py.importlib.import_module('numpy');

So übergeben Sie eine Matrix (MATLAB an nd Array)

Die Datentypkonvertierung erfolgt beim Datenaustausch zwischen MATLAB und Python. Die automatische Konvertierung lautet MATLAB zu Python, [Python zu MATLAB](https: // Es ist in jp.mathworks.com/help/matlab/matlab_external/handling-data-returned-from-python.html#buialof-53) organisiert. Wenn Sie hier einen 1-mal-N-Vektor an Python übergeben, wird dieser automatisch in den integrierten Array-Typ konvertiert. Die M-mal-N-Matrix scheint jedoch nicht automatisch konvertiert zu werden.

matrix = np.array(rand(2));

%Error: py.builtin_function_or_method/subsref
% MATLAB 'double'Die Konvertierung in Python ist 1-Wird nur für N Vektoren unterstützt.

Daher scheint es, dass es in die ndarray-Form konvertiert werden kann, indem die folgenden Schritte ausgeführt werden, indem das Matlab-Zellenarray automatisch in Python-Taple konvertiert wird.

mat_org = rand(2);
for i = 1:size(mat_org, 1)
    mat_cell{i} = mat_org(i, :);
end
matrix = np.array(mat_cell);

disp(mat_org);       %Originalmatrix(MATLAB)
py.print(matrix);    %Matrix nach der Konvertierung(ndarray)

Es ist mühsam, jedes Mal eine for-Anweisung zu schreiben, daher ist es besser, sie als Funktion zu verwenden.

mat2ndarray.m


function ndarray = mat2ndarray(mat)
% ndarray = mat2ndarray(mat)Konvertieren Sie die Matrix in das Python-ndarray-Format und kehren Sie zurück

validateattributes(mat, {'numeric'}, {'2d'})
n_rows = size(mat, 1);
mat_cell = cell([1, n_rows]);

for r = 1:n_rows
    mat_cell{r} = mat(r, :);
end
ndarray = py.numpy.array(mat_cell);
end

So führen Sie eine Funktion mit angegebenen Parametern aus

In Python kann Geben Sie den Parameternamen an und übergeben Sie ihn an die Funktion auftreten. In diesem Fall besteht das Problem darin, dass die Syntax zwischen MATLAB und Python unterschiedlich ist. Verwenden Sie als Lösung die [pyargs-Funktion] von MATLAB (https://jp.mathworks.com/help/matlab/ref/pyargs.html).

Um beispielsweise den Durchschnitt für jede Spalte einer Matrix mit numpy zu berechnen, gehen Sie wie folgt vor.

mat = mat2ndarray(rand(2));
%Np in Python.average(a=mat, axix=0)Gleichwertig
ave = np.average(pyargs('a', mat, 'axis', py.int(0)));

Hierbei ist zu beachten, dass MATLAB Zahlen grundsätzlich als Doppeltypen behandelt.

Erhalten Sie Ergebnisse von Python

So erhalten Sie eine Matrix (ndarray zu MATLAB)

Wenn die Verarbeitung in Python abgeschlossen ist, kehren Sie zum Grundtyp von MATLAB zurück und zeichnen ihn. In diesem Fall ist eine Konvertierung in eine MATLAB-Matrix erforderlich, die jedoch nicht einfach wie unten gezeigt konvertiert werden kann.

n_mat = np.average(pyargs('a', mat2ndarray(rand(2)), 'axis', py.int(0)));  %Einige Verarbeitungsergebnisse
double(n_mat);    %Ich möchte in eine Matlab-Matrix konvertieren
%Error: double
% py.numpy.Konvertierung von ndarray in double nicht möglich.

Daher muss es konvertiert werden sowie [Wie man eine Matrix übergibt](# Wie man eine Matrix übergibt (MATLAB an ndarray)). Verwenden Sie daher nach der Konvertierung in einen Vektor vom Typ "array.array" die Informationen in "ndarray.shape" in Funktion umformen. Formen Sie es mit HTML). Insbesondere kann es mit der folgenden Funktion [^ refdiscussion] konvertiert werden.

function mat = ndarray2mat(ndarray)
% mat = narray2mat(mat)Konvertiert die Python-Narray-Formatmatrix in die MATLAB-Formatmatrix und gibt sie zurück

validateattributes(ndarray, {'py.numpy.ndarray'}, {'scalar'});
np = py.importlib.import_module('numpy');

shape = cell(ndarray.shape);            %Lesen Sie die Form
shape = cellfun(@(x) int64(x), shape);  % py.Konvertiere int in int64

if shape == 1
    %Vermeiden Sie bei Skalaren Fehler
    shape = [1, 1];
end

%Daten als Vektor lesen
data = py.array.array(ndarray.dtype.char, np.nditer(ndarray));
data = double(data);                    % py.array.Array in double konvertieren
mat = reshape(data, shape);             %Ordnen Sie die Form in einer Matrix an
end

[^ refdiscussion]: Ich habe auf [diese Diskussion] verwiesen (https://jp.mathworks.com/matlabcentral/answers/157347-convert-python-numpy-array-to-double).

Ich möchte die Daten mit matplotlib anzeigen

Lassen Sie uns das Ergebnis mit matplotlib anzeigen, ohne auf das Plot-Tool von MATLAB [^ matplotlib] angewiesen zu sein. In meiner Umgebung (Anaconda) konnte ich jedoch aufgrund eines Qt-bezogenen Fehlers nicht zeichnen.

Als ich Umgebungsvariablen unter Bezugnahme auf diesen Artikel hinzufügte, konnte ich gut zeichnen. Unten finden Sie den Code zum Hinzufügen des Qt-Pfads für die Hogehoge-Umgebung.

QtPath = [getenv('userprofile'),...
    '\AppData\Local\Continuum\anaconda3\envs\hogehoge\Library\plugins'];
setenv('QT_PLUGIN_PATH', [getenv('QT_PLUGIN_PATH'), QtPath]);
clearvars QtPath;

Wenn ich diesen Code in "startup.m" setze, könnte ich ihn richtig zeichnen.

[^ matplotlib]: Es ist seltsam, matplotlib, das MATLAB-ähnliche Diagrammzeichnungen bietet, auf MATLAB zu verwenden ...
Ich bin jedoch der Meinung, dass matplotlib für das Standardfarbschema besser ist.

Ich möchte sklearn und seaborn verwenden

Wenn Sie Python verwenden, möchten Sie scicit-learn oder seaborn verwenden. Es scheint jedoch, dass diese aus irgendeinem Grund nicht importiert werden können.

%Ich kann nicht einmal die Hilfe sehen ...
py.help('seaborn')
% problem in seaborn - ImportError: DLL load failed:Die angegebene Prozedur kann nicht gefunden werden.

Wenn jemand die Ursache oder Lösung kennt, lassen Sie es mich bitte wissen ...

abschließend

Das Obige ist die Methode zur Verwendung von Python von MATLAB in dem von mir untersuchten Bereich. Zusammenfassend dachte ich, es wäre überwältigend einfacher, ** einzeln auszuführen und die Dateien zu übergeben **. Ich denke, es ist oft einfacher, einen Prozess zum Übergeben einer CSV-Datei mithilfe einer Bibliothek zu schreiben, als zu lernen, wie man Python von MATLAB aus aufruft.

<! - Wenn Sie den Prozess zum Übertragen von Dateien festlegen, ist die Übertragung in andere Sprachen reibungslos. ->

Außerdem ist es in meiner Umgebung fatal, dass ** Scikit-Learn nicht verwendet werden kann **. Wenn es sich nur um Numpy- und Scipy-Funktionen handelt, sind die integrierten Funktionen von MATLAB meiner Meinung nach leistungsfähiger.

Darüber hinaus bieten Spyder und Pycharm Unterstützung wie eine starke Code-Vervollständigung, MATLAB bietet jedoch eine schlechte Unterstützung.

In Anbetracht dessen ist der aktuelle "Python-Aufruf von MATLAB" keine sehr gute Methode. Es gibt jedoch einige Teile, die noch nicht vollständig untersucht wurden. Wenn Sie damit vertraut sind, würde ich es begrüßen, wenn Sie es mit Kommentaren ergänzen könnten.

Alternative

Alternativ ist es besser, ein MATLAB-Skript bzw. ein Python-Skript vorzubereiten und Daten mit Dateien oder Standardeingaben / -ausgaben auszutauschen. Wenn Sie beispielsweise ein MATLAB-Hauptskript (main.m) und ein Python-Skript (hogehoge.py) haben, die die Verarbeitung ausführen, sieht die Verarbeitung wie folgt aus.

  1. main.m bereitet die Daten vor und schreibt sie in die Eingabedatei
  2. Führen Sie ein Python-Skript von main.m wie ! Python hogehoge.py aus
  3. hogehoge.py verarbeitet und speichert in der Ausgabedatei
  4. Lesen Sie die verarbeiteten Daten aus der Ausgabedatei von main.m

Verweise

  1. Einführung in Python in MATLAB (offizielles MATLAB-Dokument)
  2. Probleme, die bei Verwendung von py als undefiniert gelten (Qiita-Artikel)
  3. Pyversionsfunktion (offizielles MATLAB-Dokument)
  4. Vom Numpy-Array zum Double konvertieren (MATLAB Answers)
  5. Python-Funktionsargumente (offizielles MATLAB-Dokument)

Recommended Posts

Ich wollte die Python-Bibliothek von MATLAB verwenden
Ich möchte ein Glas aus Python verwenden
Verwendung der C-Bibliothek in Python
Ich möchte MATLAB feval mit Python verwenden
Ich möchte Ceres Solver aus Python verwenden
[Python] Verwendung der Diagrammerstellungsbibliothek Altair
Ich möchte R-Datensatz mit Python verwenden
Ich wollte die 3D-Partikelsimulation mit der Python-Visualisierungsbibliothek Matplotlib visualisieren.
Verwendung von Anfragen (Python Library)
Verwenden Sie die Flickr-API von Python
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Ich wollte den Panasonic Programming Contest 2020 mit Python lösen
[Python] Verwendung von Matplotlib, einer Bibliothek zum Zeichnen von Diagrammen
[Python] Ich möchte die Option -h mit argparse verwenden
Ich wusste nicht, wie ich die [Python] für die Anweisung verwenden sollte
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Übergeben Sie die OpenCV-Daten der ursprünglichen C ++ - Bibliothek an Python
Ich habe eine Python-Bibliothek erstellt, um die API von LINE WORKS aufzurufen
Ich wollte ABC160 mit Python lösen
Ich wollte ABC159 mit Python lösen
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Ich wollte ABC172 mit Python lösen
Über den Fehler, den ich beim Versuch, Adafruit_DHT von Python auf Raspberry Pi zu verwenden, festgestellt habe
Ich konnte den Thermodrucker "PAPERANG" aus Python (Windows10, Python3.6) drucken.
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 9 Verwendung aus der C-Sprache
Verwenden Sie Python aus Java mit Jython. Ich war auch süchtig danach.
Ich wollte den NOMURA Contest 2020 mit Python lösen
Studie aus Python Hour7: Verwendung von Klassen
Verwendung der Python-Bildbibliothek in der Python3-Serie
Ich möchte mit Python eine E-Mail von Google Mail senden.
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
Geben Sie die ausführbare Python-Datei an, die mit virtualenv verwendet werden soll
Ich wollte mit der Bezier-Kurve spielen
Ich wollte Python 3.4.3 mit Homebrew + pyenv installieren
[Bash] Holen Sie sich die Kraft von Python aus Bash mithilfe der folgenden Dokumentation
Verwendung der Grafikzeichnungsbibliothek Bokeh
Der einfachste Weg, OpenCV mit Python zu verwenden
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
[Algorithmus x Python] Verwendung der Liste
Verwenden Sie das Python-Framework "cocotb", um Verilog zu testen.
Rufen Sie die Python-Bibliothek zur Textnormalisierung in MATLAB auf
Was ich beim Update von Python 2.6 auf 2.7 gemacht habe
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3
Ich möchte C ++ - Code aus Python-Code erstellen!
[Python] Ich werde FTP auf den FTP-Server hochladen.
Verwenden Sie die LibreOffice-App in Python (3) Bibliothek hinzufügen
Verwenden Sie das nghttp2 Python-Modul von Homebrew aus pyenvs Python
Ich möchte die Aktivierungsfunktion Mish verwenden
Ich möchte den Fortschritt in Python anzeigen!
Verwenden Sie Tor, um eine Verbindung von urllib2 [Python] [Mac] herzustellen.
Python: Entpacken Sie die Standardeingabe mit zipfile
Verwenden Sie thingspeak aus Python
Verwenden Sie fließend Python
Änderungen von Python 3.0 zu Python 3.5
Änderungen von Python 2 zu Python 3.0
Verwenden Sie MySQL aus Python
Verwenden Sie MySQL aus Python
Verwenden Sie BigQuery aus Python.
Verwenden Sie mecab-ipadic-neologd von Python
Python Ich weiß nicht, wie ich den Druckernamen bekomme, den ich normalerweise benutze.