Je voulais utiliser la bibliothèque Python de MATLAB

introduction

À propos de cet article

MATLAB et Python ont chacun leurs avantages. MATLAB est fort dans les opérations matricielles et ses points forts incluent les documents japonais et l'existence de Simlink. D'autre part, l'utilisation de Python est gratuite et les bibliothèques d'apprentissage automatique riches telles que scicit-learn sont attrayantes. Par conséquent, vous souhaiterez peut-être les utiliser correctement.

Pour un tel cas, il existe Possibilité d'appeler Python directement depuis MATLAB. (Au contraire, vous pouvez également Appeler la fonction MATLAB depuis Python, mais je n'y toucherai pas cette fois.)

Cependant, même si je le recherche, le document officiel n'est pas très pratique [^ exemple]. Par conséquent, cette fois, je vais organiser et résumer ** les informations qui semblent utiles dans la pratique **.

Ce que je voulais faire

Dans le passé, il y avait des moments où je voulais traiter la partie d'apprentissage automatique avec Python et utiliser MATLAB pour préparer des données d'entraînement et évaluer le modèle. Vous pouviez écrire et exécuter le code dans chaque langue et échanger les résultats dans un fichier dat ou un fichier mat, mais c'était un peu gênant. Alors, quand j'ai découvert cette fonction, je me suis dit: "Je peux vous faciliter la tâche!" (En fait, la conclusion que j'ai examinée était "** L'appel Python de MATLAB n'est pas souhaitable **")

[^ exemple]: Il n'y a qu'un exemple de textwrap.wrap, et je n'ai aucune idée de comment utiliser réellement numpy etc ... (je pense que je voulais l'expliquer uniquement avec la bibliothèque standard)

Se préparer à utiliser python

Avant de l'utiliser avec MATLAB, vous devez installer l'interpréteur Python et enregistrer son chemin. Cependant, python a Version officielle et Version Anaconda, donc la procédure change un peu. Je vais.

Pour utiliser la version officielle de Python.org, installez selon Explication here. seulement.

En revanche, si le chemin n'est pas passé dans l'environnement Anaconda ou dans la version officielle, il est nécessaire de définir le chemin individuellement sur MATLAB. Tout d'abord, recherchez le chemin de l'interpréteur que vous souhaitez utiliser. Ensuite, définissez le chemin vérifié par la fonction pyversion. Par exemple, pour utiliser l'environnement hogehoge d'Anaconda, écrivez comme suit.

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

Exécutez pyversion sans argument pour voir s'il est correctement configuré. Si la version est affichée, cela devrait être correct.

Processus en utilisant Python

Appeler une fonction python

Ensuite, appelons une fonction Python. Pour appeler une fonction nommée command en Python depuis MATLAB, utilisez simplement py.command. Par exemple, si vous souhaitez exécuter la fonction d'impression python, procédez comme suit.

py.print("Hello world!");

Cependant, il convient de noter que MATLAB et Python ont des types de données et une syntaxe intégrés différents. Par exemple, même si c'est possible en Python, la notation suivante n'est pas autorisée.

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

%  py.print("{0} {1}".format("Hello", "world!"));
%                    ↑
%Erreur:Opérateur MATLAB inattendu.

Pour une exécution correcte, le type de chaîne MATLAB est explicitement converti en type de chaîne Python (https://jp.mathworks.com/help/matlab/matlab_external/handling-data-returned-from- python.html) Vous devez le faire.

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

Comment importer

Ensuite, à propos de Comment importer des packages Python. La page ci-dessus décrit l'équivalent syntaxique de from x import y en python. Cependant, en pratique, une syntaxe comme ʻimport numpy as np` est souvent utilisée. Cela peut être écrit comme suit à partir de [Implémentation de l'instruction d'importation] du côté python (https://docs.python.org/ja/3/library/importlib.html).

%Code équivalent à importer numpy en tant que np en Python
np = py.importlib.import_module('numpy');

Comment passer une matrice (MATLAB à nd tableau)

La conversion du type de données se produit lors de l'échange de données entre MATLAB et Python. La conversion automatique est MATLAB vers Python, [Python vers MATLAB](https: // Il est organisé dans jp.mathworks.com/help/matlab/matlab_external/handling-data-returned-from-python.html#buialof-53). Ici, lors du passage d'un vecteur 1 par N à Python, il est automatiquement converti en type tableau intégré. Cependant, la matrice M-by-N ne semble pas être convertie automatiquement.

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

%Erreur: py.builtin_function_or_method/subsref
% MATLAB 'double'La conversion en Python est 1-Uniquement pris en charge pour N vecteurs.

Par conséquent, il semble qu'il puisse être converti en forme ndarray en procédant comme suit en utilisant le fait que le tableau de cellules de Matlab est automatiquement converti en Python taple.

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);       %Matrice d'origine(MATLAB)
py.print(matrix);    %Matrice après conversion(ndarray)

Il est difficile d'écrire une instruction for à chaque fois, il est donc préférable de l'utiliser comme une fonction.

mat2ndarray.m


function ndarray = mat2ndarray(mat)
% ndarray = mat2ndarray(mat)Convertir la matrice au format python ndarray et retourner

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

Comment exécuter une fonction avec des paramètres spécifiés

En python, Spécifiez le nom du paramètre et transmettez-le à la fonction peut se produire. Dans ce cas, le problème est que la syntaxe est différente entre MATLAB et Python. La solution est d'utiliser la MATLAB fonction pyargs.

Par exemple, pour calculer la moyenne de chaque colonne d'une matrice avec numpy, procédez comme suit.

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

Il convient de noter ici que MATLAB traite essentiellement les nombres comme des types doubles.

Recevoir les résultats de Python

Comment recevoir une matrice (ndarray vers MATLAB)

Lorsque le traitement en Python est terminé, vous retournerez au type de base de MATLAB et le tracerez. Dans ce cas, il est nécessaire de convertir en une matrice MATLAB, mais elle ne peut pas être simplement convertie comme indiqué ci-dessous.

n_mat = np.average(pyargs('a', mat2ndarray(rand(2)), 'axis', py.int(0)));  %Certains résultats de traitement
double(n_mat);    %Je veux convertir en une matrice matlab
%Erreur: double
% py.numpy.Impossible de convertir ndarray en double.

Par conséquent, il doit être converti ainsi que [Comment passer une matrice](# Comment passer une matrice (MATLAB à ndarray)). Par conséquent, une fois converti en un vecteur de type ʻarray.array, utilisez les informations de ndarray.shape` pour [remodeler la fonction](https://jp.mathworks.com/help/matlab/ref/reshape. Façonnez-le avec html). Plus précisément, il peut être converti avec la fonction suivante [^ refdiscussion].

function mat = ndarray2mat(ndarray)
% mat = narray2mat(mat)Convertit la matrice de format narray python en matrice de format MATLAB et retourne

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

shape = cell(ndarray.shape);            %Lire la forme
shape = cellfun(@(x) int64(x), shape);  % py.Convertir int en int64

if shape == 1
    %Pour les scalaires, évitez les erreurs
    shape = [1, 1];
end

%Lire les données sous forme de vecteur
data = py.array.array(ndarray.dtype.char, np.nditer(ndarray));
data = double(data);                    % py.array.Convertir le tableau en double
mat = reshape(data, shape);             %Organiser la forme dans une matrice
end

[^ refdiscussion]: J'ai fait référence à cette discussion.

Je veux afficher les données avec matplotlib

Affiche le résultat avec matplotlib sans s'appuyer sur l'outil de traçage de MATLAB [^ matplotlib]. Cependant, dans mon environnement (Anaconda), une erreur liée à Qt s'est produite et je n'ai pas pu tracer.

Ainsi, lorsque j'ai ajouté des variables d'environnement en faisant référence à cet article, j'ai pu bien tracer. Vous trouverez ci-dessous le code pour ajouter le chemin Qt pour l'environnement hogehoge.

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

Si vous écrivez ce code dans startup.m, vous pouvez le tracer correctement.

[^ matplotlib]: Il est étrange d'utiliser matplotlib, qui fournit des graphiques de type MATLAB, sur MATLAB ...
Cependant, je pense que matplotlib est meilleur pour le jeu de couleurs par défaut.

Je veux utiliser sklearn et seaborn

Si vous utilisez Python, vous souhaitez utiliser scicit-learn ou seaborn. Cependant, il semble que ceux-ci ne peuvent être importés pour une raison quelconque.

%Je ne vois même pas l'aide ...
py.help('seaborn')
% problem in seaborn - ImportError: DLL load failed:La procédure spécifiée est introuvable.

Si quelqu'un connaît la cause ou la solution, faites-le moi savoir ...

en conclusion

Ce qui précède est la méthode d'utilisation de Python de MATLAB dans la plage que j'ai étudiée. En conclusion, j'ai pensé qu'il serait extrêmement plus facile d'exécuter ** individuellement et de remettre les fichiers **. Je pense qu'il est beaucoup plus facile d'écrire un processus pour transmettre un fichier csv à l'aide d'une bibliothèque que d'apprendre à appeler Python à partir de MATLAB.

<! - De plus, si vous définissez le processus pour transférer des fichiers, le transfert vers d'autres langues sera fluide. ->

De plus, dans mon environnement, il est fatal que ** scikit-learn ne puisse pas être utilisé **. S'il ne s'agit que de fonctions numpy et scipy, je pense que les fonctions intégrées de MATLAB sont plus puissantes.

De plus, spyder et pycharm fournissent un support tel que la complétion de code forte, mais MATLAB fournit un support médiocre.

Compte tenu de ce qui précède, l '"appel Python de MATLAB" actuel n'est pas une très bonne méthode. Cependant, certaines parties n'ont pas fait l'objet d'une enquête approfondie, donc si vous le connaissez, je vous serais reconnaissant de bien vouloir le compléter par des commentaires.

Alternative

Comme alternative, il est préférable de préparer respectivement un script MATLAB et un script Python, et d'échanger des données avec des fichiers ou des entrées / sorties standard. Par exemple, si vous avez un script MATLAB principal (main.m) et un script Python (hogehoge.py) qui effectue le traitement, le traitement sera le suivant.

  1. main.m prépare les données et les écrit dans le fichier d'entrée
  2. Exécutez un script Python à partir de main.m comme ! Python hogehoge.py
  3. processus hogehoge.py et enregistre dans le fichier de sortie
  4. Lisez les données traitées à partir du fichier de sortie par main.m

Les références

  1. Introduction à python dans MATLAB (document officiel MATLAB)
  2. Problèmes qui ne sont pas définis lors de l'utilisation de py (article Qiita)
  3. fonction pyversion (document officiel MATLAB)
  4. Convertir du tableau numpy en double (MATLAB Answers)
  5. Arguments de la fonction Python (document officiel MATLAB)

Recommended Posts

Je voulais utiliser la bibliothèque Python de MATLAB
Je veux utiliser jar de python
Comment utiliser la bibliothèque C en Python
Je veux utiliser MATLAB feval avec python
Je veux utiliser le solveur ceres de python
[Python] Comment utiliser la bibliothèque de création de graphes Altair
Je veux utiliser le jeu de données R avec python
Je voulais visualiser la simulation de particules 3D avec la bibliothèque de visualisation Python Matplotlib.
Comment utiliser les requêtes (bibliothèque Python)
Utilisez l'API Flickr de Python
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
Je voulais résoudre le concours de programmation Panasonic 2020 avec Python
[python] Comment utiliser Matplotlib, une bibliothèque pour dessiner des graphiques
[Python] Je souhaite utiliser l'option -h avec argparse
Je ne savais pas comment utiliser l'instruction [python] for
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
Transmettez les données OpenCV de la bibliothèque C ++ d'origine à Python
J'ai créé une bibliothèque Python pour appeler l'API de LINE WORKS
Je voulais résoudre ABC160 avec Python
Je voulais résoudre ABC159 avec Python
Je voulais résoudre le problème ABC164 A ~ D avec Python
Je voulais résoudre ABC172 avec Python
À propos de l'erreur que j'ai rencontrée en essayant d'utiliser Adafruit_DHT à partir de Python sur Raspberry Pi
J'ai pu imprimer l'imprimante thermique "PAPERANG" depuis Python (Windows10, Python3.6)
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 9 Utilisation à partir du langage C
Utilisez Python de Java avec Jython. J'étais aussi accro.
Je voulais résoudre NOMURA Contest 2020 avec Python
Étude de Python Hour7: Comment utiliser les classes
Comment utiliser la bibliothèque d'images Python dans la série python3
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
[Python] Je veux gérer 7DaysToDie depuis Discord! 1/3
Spécifiez le fichier exécutable Python à utiliser avec virtualenv
Je voulais jouer avec la courbe de Bézier
Je voulais installer Python 3.4.3 avec Homebrew + pyenv
[Bash] Obtenez la puissance de python de bash en utilisant la documentation ici
Comment utiliser la bibliothèque de dessins graphiques Bokeh
Le moyen le plus simple d'utiliser OpenCV avec python
Je souhaite utiliser le répertoire temporaire avec Python2
[Algorithm x Python] Comment utiliser la liste
Utilisez le framework Python "cocotb" pour tester Verilog.
Appelez la bibliothèque Python pour la normalisation de texte depuis MATLAB
Ce que j'ai fait lors de la mise à jour de Python 2.6 vers 2.7
[Python] Je veux gérer 7DaysToDie depuis Discord! 2/3
Je veux créer du code C ++ à partir de code Python!
[Python] Je vais télécharger FTP sur le serveur FTP.
Utilisez l'application LibreOffice en Python (3) Ajouter une bibliothèque
Utilisez le module Python nghttp2 de Homebrew de Python de pyenv
Je souhaite utiliser la fonction d'activation Mish
Je veux afficher la progression en Python!
Utilisez Tor pour vous connecter depuis urllib2 [Python] [Mac]
Python: décompressez depuis l'entrée standard en utilisant zipfile
Utilisez Thingsspeak de Python
Utiliser fluentd de python
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
Utilisez MySQL depuis Python
Utiliser MySQL depuis Python
Utilisez BigQuery depuis Python.
Utilisez mecab-ipadic-neologd de Python
python Je ne sais pas comment obtenir le nom de l'imprimante que j'utilise habituellement.