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.)
La translocation de la matrice M est M'in MATLAB et M.T dans NumPy.
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.
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.
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 ().
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 ().
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.
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.
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