Conseils et précautions lors du portage des programmes MATLAB vers Python

Il y a des moments où je dois porter un programme MATLAB vers Python environ une fois par an, mais je vais résumer les conseils et les précautions que j'ai remarqués à ce moment-là. Sera ajouté à tout moment. (Ce qui suit comprend la documentation officielle de NumPy / SciPy sur les différences avec MATLAB Et Numpy pour les utilisateurs MATLAB contient de nombreux doublons.)

Translocation

La translocation de la matrice M est M'in MATLAB et M.T dans NumPy.

[A B] pour les séquences A, B

L'opération [A B] sur les tableaux A, B dans MATLAB est équivalente à numpy.hstack ([A, B]) dans NumPy. (A et B doivent être de la même taille sauf dans la dernière dimension.)

size() La taille de chaque dimension du tableau A est calculée par taille (A) dans MATLAB, mais par numpy.shape (A) dans NumPy. Notez que numpy.size (A) donnera le nombre d'éléments contenus dans le tableau A.

Index du tableau

Tout le monde doit savoir que dans MATLAB, l'index d'un élément d'un tableau commence à 1 et dans NumPy, il commence à 0, mais il y a aussi une différence dans l'index d'un tableau par rapport à la ** dimension **. Vous devez être prudent. Autrement dit, sum (A, 2) dans MATLAB additionne le long de la deuxième dimension du tableau A, qui doit être numpy.sum (A, axis = 1) dans NumPy.

Fonctions qui effectuent des opérations le long d'une dimension spécifique (sum (), mean (), std (), var (), max (), min (), ...)

Sum (A) dans MATLAB fait la somme le long de la première dimension du tableau A, tandis que NumPy additionne tous les éléments du tableau A (sauf si axis est spécifié). Par conséquent, ** sum (A) dans MATLAB est équivalent à numpy.sum (A, axis = 0) dans NumPy **. Ce comportement est le même pour les autres fonctions qui effectuent des opérations le long d'une dimension spécifique, telles que mean (), std (), var (), max (), min ().

Taille / forme du tableau après application de la fonction

Par rapport à ce qui précède, lors de l'exécution d'opérations le long d'une dimension spécifique avec sum (), mean (), std (), var (), etc., dans MATLAB et NumPy sur la dimension du tableau résultant. Il y a des différences et vous devez être prudent. Par exemple, si vous voulez calculer "prendre une moyenne le long de la deuxième dimension d'un tableau tridimensionnel A et la soustraire du tableau d'origine", vous pouvez le trouver avec A --mean (A, 2) dans MATLAB, mais avec NumPy. A --- numpy.mean (A, 1) donne une erreur. Ceci est ** le résultat de la moyenne (A, 2) dans MATLAB est un tableau tridimensionnel (la taille de la dimension moyenne est 1), alors que le résultat de numpy.mean (A, 1) dans NumPy En effet, le résultat est un tableau bidimensionnel (la dimension moyenne est effacée) **, donc la soustraction du tableau tridimensionnel n'est pas possible (généralement). Dans ce cas, dans NumPy, il est nécessaire de compléter explicitement la dimension effacée avec numpy.newaxis comme A --numpy.mean (A, 1) [:, numpy.newaxis ,:].

reshape() Vous pouvez utiliser reshape () lorsque vous souhaitez modifier uniquement la forme sans modifier les éléments du tableau. A, 2, 2) produit [1 3; 2 4], tandis que NumPy produit numpy.reshape (A, (2, 2)) [[1, 2], [3, 4]. ]] Est généré. En d'autres termes, ** MATLAB remplit d'abord les éléments le long de la première dimension, mais NumPy remplit d'abord les éléments le long de la dernière dimension **. Si vous voulez que NumPy remplisse les éléments dans un ordre semblable à MATLAB, vous devez donner 'F' l'ordre des arguments du mot-clé dans numpy.reshape ().

A (:) pour la séquence A

Liée à ce qui précède, l'opération A (:) sur le tableau multidimensionnel A dans MATLAB renvoie un vecteur colonne qui réorganise tous les éléments de A dans une dimension, dans laquelle ** MATLAB commence à partir du premier élément. Tout d'abord, sortez les éléments et disposez-les selon la première dimension **. D'autre part, numpy.ravel (A) de numPy réorganise également le tableau multidimensionnel en un tableau à une dimension, mais ** NumPy extrait d'abord les éléments du premier élément le long de la dernière dimension et les arrange. ** Par conséquent, l'ordre des éléments est différent du résultat de A (:) dans MATLAB. Si vous voulez que NumPy arrange les éléments dans un ordre semblable à MATLAB, vous devez donner 'F' l'ordre des arguments du mot-clé dans numpy.ravel ().

zeros(), ones() Zeros (n) dans MATLAB produit un tableau bidimensionnel de taille n x n et tous les éléments ont des valeurs nulles, tandis que numpy.zeros (n) de numPy produit un tableau unidimensionnel de taille n. Par conséquent, ** zeros (n) dans MATLAB est équivalent à numpy.zeros ((n, n)) dans NumPy ** (notez que la forme du tableau généré doit être donnée sous forme de taple. ). S'il y a deux arguments ou plus, MATLAB et NumPy se comportent de la même manière. Autrement dit, les zéros (m, n) dans MATLAB et numpy.zeros ((m, n)) dans NumPy produisent un tableau à deux dimensions de taille m x n. Ce comportement est le même pour les uns ().

rank() Le rang de la matrice M est calculé par rang (M) dans MATLAB, mais par numpy.linalg.matrix_rank (M) dans NumPy. Notez que numpy.rank (M) donne le nombre de dimensions du tableau M (c'est-à-dire M.ndim, c'est-à-dire len (M.shape)).

eig() La valeur propre de la matrice M est trouvée par eig (M) dans MATLAB, mais par numpy.linalg.eigvals (M) dans NumPy. Notez que si vous utilisez numpy.eig (M), en plus du vecteur qui a la valeur propre comme élément, vous recevrez également la matrice qui a le vecteur propre dans la colonne en même temps (w, V = numpy.eig (M), le vecteur w est la valeur propre, La matrice V est le vecteur propre). Même dans MATLAB, les valeurs propres et les vecteurs propres peuvent être obtenus en recevant deux valeurs de retour de eig (M). Dans ce cas, une matrice avec des vecteurs propres en colonnes et une matrice diagonale ** avec des valeurs propres comme composantes diagonales ** Notez qu'il sera reçu sous la forme de ([V, D] = eig (M), la matrice V est le vecteur propre et la matrice D est la valeur propre).

svd() Pour la décomposition de singularité de la matrice M, MATLAB utilise svd (M) et NumPy utilise numpy.linalg.svd (M). Si vous recevez trois valeurs de retour dans MATLAB, vous obtiendrez les matrices U, S et V, où S a des valeurs singulières comme éléments diagonaux et U et V sont des colonnes avec des vecteurs singuliers gauche et droit, respectivement. .. Les tableaux u, d, v sont obtenus à partir de svd (M) de NumPy, où u est une matrice avec des vecteurs singuliers à gauche dans les colonnes, d est un ** tableau à une dimension avec des valeurs singulières comme éléments ** et v est un vecteur singulier à droite. Est une ** matrice avec ** lignes. En d'autres termes, U dans MATLAB et u dans NumPy correspondent, mais pas les autres, et S correspond à numpy.diag (d) et V correspond à la transposition de v (translocation hermeet dans le cas d'une matrice complexe). ..

cov() C'est une fonction qui calcule la covariance entre les variables à partir d'une matrice de données à plusieurs variables, mais dans MATLAB et NumPy, l'interprétation des lignes et des colonnes de la matrice de données est inversée. Autrement dit, dans MATLAB, chaque ** colonne ** correspond à chaque variable, mais dans NumPy, chaque ** ligne ** correspond à chaque variable. Par conséquent, MATLAB cov (X) est équivalent à numpy.cov (X.T) de NumPy.

linspace(a, b, n) Il se comporte presque de la même manière dans MATLAB et NumPy, à la différence que lorsque n est 1, MATLAB renvoie b, mais NumPy renvoie a.

Structure

Il existe plusieurs façons de représenter une structure MATLAB en Python, mais je pense qu'il est souvent pratique d'utiliser le tableau structuré de NumPy. Notez, cependant, que les structures MATLAB peuvent ajouter des champs de manière dynamique, tandis que le tableau structuré de NumPy doit définir tous les champs lors de la déclaration.

[・] Pour la structure

L'opération [S.f] sur le champ f de la structure S dans MATLAB correspond à S ['f'] sur le champ f du tableau structuré S de NumPy. Cependant, si S ['f'] est un tableau multidimensionnel, alors il doit être numpy.hstack (S ['f']) (c'est-à-dire décomposer le tableau pour la première dimension et dans le sens de la dernière dimension. Rejoindre).

Recommended Posts

Conseils et précautions lors du portage des programmes MATLAB vers Python
Précautions lors du passage de def aux fonctions triées et groupby en Python? ??
Portage et modification du solveur de doublets de python2 vers python3.
[Python] Précautions lors de l'affectation de valeurs à des tableaux multidimensionnels
Astuces Python et Numpy
Précautions pour la mise à niveau de TensorFlow (vers la version 1.3)
~ Conseils pour les débutants de Python présentés avec amour par Pythonista ③ ~
Apprenez les bases et les astuces des expressions canoniques Python à partir de zéro
Conseils pour coder courts et faciles à lire en Python
Précautions lors de la saisie à partir de CSV avec Python et de la sortie vers json pour faire exe
Appelez Matlab depuis Python pour optimiser
Python 3.6 sous Windows ... et vers Xamarin.
Précautions lors de l'utilisation de Pit avec Python
[Introduction à Python3 Jour 1] Programmation et Python
Précautions lors de l'utilisation de codecs et de pandas
Conseils lorsque Vimmer passe à Pycharm
Conseils à savoir lors de la programmation de la compétition avec Python2 (Autres spécifications du langage)
Comment gérer les erreurs lors de l'installation de Python et de pip avec choco
Précautions lors de la création d'un générateur Python
Journalisation Python et vidage vers json
Sélénium et python pour ouvrir Google
Précautions lors de l'utilisation de phantomjs de python
Précautions lors de l'attribution de valeurs par défaut aux arguments dans les définitions de fonctions Python
Précautions lors de l'utilisation de six avec Python 2.5
Essayez d'écrire du code python pour générer du code go - Essayez de porter JSON-to-Go et ainsi de suite
Précautions et gestion des erreurs lors de l'appel de la DLL .NET à partir de python à l'aide de pythonnet
De Python à l'utilisation de MeCab (et CaboCha)
[Python] Utiliser et et ou lors de la création de variables
Conseils pour faciliter la lecture des documents d'audition Python
Comment installer et utiliser pandas_datareader [Python]
Précautions lors du décapage d'une fonction en python
Lier des méthodes aux classes et instances Python
Points à noter lors de la résolution de problèmes DP avec Python
Fractal pour faire et jouer avec Python
[Débutant] Installation de Python et exécution de programmes (Windows)
Lire Python csv et exporter vers txt
python: Comment utiliser les locals () et globals ()
[Python] Comment calculer MAE et RMSE
Comment utiliser le zip Python et énumérer
Compressez les données python et écrivez sur sqlite
Comment utiliser is et == en Python
Essayez de porter le programme «Programmation informatique numérique FORTRAN77» vers C et Python (partie 1)
[Python] Précautions lors de l'acquisition de données en grattant et en les mettant dans la liste
astuces python
Conseils pour ceux qui ne savent pas comment utiliser is et == en Python
Trois choses auxquelles j'étais accro lors de l'utilisation de Python et MySQL avec Docker
Essayez de porter le programme "FORTRAN77 Numerical Computing Programming" vers C et Python (partie 3)
Pour éviter de voir l'enfer lors de l'installation de django-toolbelt avec windows, heroku et python3.4 (64bit) ...
Essayez de porter le programme "FORTRAN77 Numerical Computing Programming" vers C et Python (partie 2)
Points à garder à l'esprit lors de l'utilisation de Python pour ceux qui utilisent MATLAB
Astuces Python
Astuces Python
[Astuces] Écriture facile à lire lors de la connexion de fonctions en Python
Comment démarrer Python (Flask) au démarrage d'EC2
MessagePack-Try pour lier Java et Python avec RPC
Environnement et utilisation recommandés lors du développement avec Python
Je veux utiliser MATLAB feval avec python
Comment générer une séquence en Python et C ++
[Introduction à Python3 Jour 12] Chapitre 6 Objets et classes (6.3-6.15)