Les documents numpy recommandent d'utiliser un tableau au lieu de la matrice pour travailler avec des matrices. Cependant, contrairement à octave (que j'utilisais jusqu'à récemment), * n'effectue pas de multiplication matricielle, vous devez utiliser la fonction matrixmultipy (). Je pense que cela rend le code très illisible.
Quelqu'un partage-t-il mon point de vue et a-t-il trouvé une solution?
.*
de syntaxe vs '*' pour la multiplication élémentaire vs matrice. Si c'était le cas, tout serait plus simple, même si je suis surpris qu'ils choisissent*
de vouloir dire multiplication élémentaire et non matricielle.Réponses:
La principale raison pour éviter d'utiliser la
matrix
classe est que a) elle est intrinsèquement bidimensionnelle, et b) il y a une surcharge supplémentaire par rapport à un tableau numpy "normal". Si tout ce que vous faites est de l'algèbre linéaire, alors n'hésitez pas à utiliser la classe matricielle ... Personnellement, je trouve que cela pose plus de problèmes que cela ne vaut la peine.Pour les tableaux (antérieurs à Python 3.5), utilisez à la
dot
place dematrixmultiply
.Par exemple
Ou dans les nouvelles versions de numpy, utilisez simplement
x.dot(y)
Personnellement, je le trouve beaucoup plus lisible que l'
*
opérateur impliquant la multiplication matricielle ...Pour les tableaux en Python 3.5, utilisez
x @ y
.la source
x.T.dot(A.T).dot(A).dot(x)
n'est-ce pas illisible, mais à chacun le sien. Si vous faites principalement de la multiplication matricielle, alors utiliseznumpy.matrix
!numpy.matrixmultiply
est difficile à taper.numpy.dot
équivalent de la multiplication matricielle. Si vous n'aimez vraiment pas la notation, utilisez lamatrix
classe.les éléments clés à savoir pour les opérations sur les tableaux NumPy par rapport aux opérations sur les matrices NumPy sont:
La matrice NumPy est une sous - classe du tableau NumPy
Les opérations du tableau NumPy sont élémentaires (une fois la diffusion prise en compte)
Les opérations de la matrice NumPy suivent les règles ordinaires de l'algèbre linéaire
quelques extraits de code pour illustrer:
mais cette opération échoue si ces deux matrices NumPy sont converties en tableaux:
bien que l'utilisation de la syntaxe NP.dot fonctionne avec des tableaux ; cette opération fonctionne comme la multiplication matricielle:
alors avez-vous déjà besoin d'une matrice NumPy? c'est-à-dire qu'un tableau NumPy suffira-t-il pour le calcul d'algèbre linéaire (à condition de connaître la syntaxe correcte, c'est-à-dire NP.dot)?
la règle semble être que si les arguments (tableaux) ont des formes (mxn) compatibles avec une opération d'algèbre linéaire donnée, alors tout va bien, sinon, NumPy lance.
la seule exception que j'ai rencontrée (il y en a probablement d'autres) est le calcul de l'inverse de la matrice .
ci-dessous sont des extraits dans lesquels j'ai appelé une opération d'algèbre linéaire pure (en fait, à partir du module d'algèbre linéaire de Numpy) et passé dans un tableau NumPy
déterminant d'un tableau:
vecteurs propres / paires de valeurs propres :
norme matricielle :
factorisation qr :
rang de la matrice :
condition de la matrice :
l'inversion nécessite cependant une matrice NumPy:
mais la pseudoinverse de Moore-Penrose semble fonctionner très bien
la source
En 3.5, Python a finalement obtenu un opérateur de multiplication matricielle . La syntaxe est
a @ b
.la source
Il y a une situation où l'opérateur point donnera des réponses différentes lorsqu'il s'agit de tableaux ou de matrices. Par exemple, supposons ce qui suit:
Permet de les convertir en matrices:
Maintenant, nous pouvons voir une sortie différente pour les deux cas:
la source
Référence de http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html
..., l'utilisation de la classe numpy.matrix est déconseillée , car elle n'ajoute rien qui ne puisse être accompli avec des objets numpy.ndarray 2D , et peut conduire à une confusion quant à la classe utilisée. Par exemple,
Les opérations scipy.linalg peuvent être appliquées aussi bien à numpy.matrix qu'aux objets 2D numpy.ndarray .
la source
Cette astuce pourrait être ce que vous recherchez. C'est une sorte de simple surcharge d'opérateur.
Vous pouvez ensuite utiliser quelque chose comme la classe Infix suggérée comme ceci:
la source
Une citation pertinente de PEP 465 - Un opérateur infixe dédié pour la multiplication matricielle , comme mentionné par @ petr-viktorin, clarifie le problème auquel l'OP se heurtait:
L'introduction du
@
opérateur infix devrait aider à unifier et à simplifier le code matriciel python.la source
La fonction matmul (depuis numpy 1.10.1) fonctionne bien pour les deux types et renvoie le résultat sous forme de classe matricielle numpy:
Production:
Depuis python 3.5 comme mentionné précédemment, vous pouvez également utiliser un nouvel opérateur de multiplication matricielle
@
commeet obtenez le même résultat que ci-dessus.
la source