comment la multiplication diffèrent pour NumPy Matrice vs Tableau des classes?
La numpy docs recommandons l'utilisation de tableau au lieu de la matrice pour travailler avec des matrices. Cependant, contrairement à l'octave (que j'utilisais jusqu'à récemment), * ne pas effectuer la multiplication de matrice, vous devez utiliser la fonction matrixmultipy(). Je pense que ça rend le code illisible.
Quelqu'un partage mon point de vue, et a trouvé une solution?
- Vous allez avoir un avis et non une question. Est-il quelque chose de plus spécifique, nous pouvons vous aider avec ou peut-être vous guider en la rendant plus lisible?
- En fait les docs recommandons l'utilisation de la matrice si vous ne l'algèbre linéaire et de ne pas wan pas à utiliser multiplier() ainsi quel est le problème?
- Je n'ai pas passé par les docs en détail. Juste par curiosité, quels sont les avantages de faire des tableaux offrent par rapport à la matrice de classe? J'ai trouvé que les tableaux ne font pas de distinction entre les lignes et de colonnes. Est-ce parce que les tableaux sont censés être considérés comme des tenseurs plutôt que de matrices? Comme Joe l'a souligné, le fait que la matrice de classe 2-dim est assez limitant. Quelle est la pensée qui sous-tend ce type de conception, comme dans, pourquoi ne pas avoir une seule matrice de classe comme matlab/octave?
- Je suppose que le principal problème est que python n'a pas
.*
vs '*' la syntaxe de l'élément sage vs multiplication de matrice. Si elle avait alors que tout cela serait plus simple si je suis surpris qu'ils choisissent*
à la moyenne de l'élément de sage et de ne pas la multiplication de matrices.
Vous devez vous connecter pour publier un commentaire.
La raison principale pour éviter d'utiliser le
matrix
classe est que a) il est intrinsèquement à 2 dimensions, et b) il y a une charge supplémentaire par rapport à un "normal" d'un tableau numpy. Si tout ce que vous faites est de l'algèbre linéaire, puis par tous les moyens, n'hésitez pas à utiliser la matrice de classe... Personnellement je trouve plus d'ennuis que cela vaut la peine, même si.Pour les tableaux (avant Python 3.5), l'utilisation
dot
au lieu dematrixmultiply
.E. g.
Ou dans des versions plus récentes de numpy, il suffit d'utiliser
x.dot(y)
Personnellement, je trouve ça beaucoup plus lisible que la
*
opérateur, ce qui implique la multiplication de matrice...Pour les tableaux en Python 3.5, utilisez
x @ y
.numpy.matrix
!numpy.matrixmultiply
est difficile à saisir.matrixmultiply
était dépréciée de nombreuses années, et qui a été retirée en toute récente-ish (>v1.3
, peut-être?) la version de numpy.u.T * v
serait le scalaire produit scalaire, maisu * v
serait pas défini (car les dimensions ne correspondent pas). Si la multiplication de matrice est définie comme une somme sur le dernier axe de la gauche de la matrice avec l'avant-dernier axe de droite tableau, alors je suppose que la matrice de multiplication de 1-D les tableaux numpy serait un échec, parce que le droit de la matrice de ne pas avoir un avant-dernier axe. De toute façon, c'est pourquoi je suis confus.inner
pour 1d vecteurs. Le produit scalaire de deux 1D vecteurs est strictement identique à la scalaire produit scalaire. (Soit dit en passant,u.T
etu
sont identiques siu
est unidimensionnel. La ligne "vecteurs" et "vecteurs colonnes" sont en 2D, et ne sont pas des vecteurs, à proprement parler. Dans numpy, les vecteurs sont des vecteurs, et ne pas avoir une 2ème dimension, de sorte que vous avez à les remodeler en 2D pour avoir un vecteur ligne ou colonne vecteur.)numpy.dot
se comporte comme un produit scalaire pour les dimensions des vecteurs, mais ce revêtement spécial rend la fonction semble d'auto-incompatible. Je serais peut être moins confus si elle était plus commune pour les livres à voir "dot" pour la multiplication matricielle comme vous le décrivez. De toute façon, je le comprends assez pour l'utiliser, mais je déteste l'obligation j'ai l'impression de litière code avec des commentaires expliquant quenumpy.dot
effectue la multiplication de matrices.numpy.dot
équivalente à la matrice de la multiplication. Si vous n'aimez vraiment pas la notation, l'utilisation de lamatrix
classe..*
vs '*' la syntaxe de l'élément sage vs multiplication de matrice. Si elle avait alors que tout cela serait plus simple si je suis surpris qu'ils choisissent*
à la moyenne de l'élément de sage et de ne pas la multiplication de matrices.les points clés à connaître pour les opérations sur NumPy tableaux contre les opérations sur NumPy matrices sont:
NumPy matrice est un sous-classe de tableau NumPy
NumPy tableau opérations sont élément-sage (une fois de radiodiffusion est prise en compte)
NumPy matrice opérations de suivre les règles ordinaires de l'algèbre linéaire
quelques extraits de code pour illustrer:
mais cela opérations échoue, si ces deux NumPy matrices sont convertis à des tableaux:
bien que l'utilisation de la NP.dot syntaxe fonctionne avec tableaux; des opérations de travaux comme la multiplication de matrice:
si vous avez besoin d'un NumPy matrice? c'est à dire, un tableau NumPy suffire pour l'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 (m x n) est-il compatible avec l'un d'algèbre linéaire de l'opération, alors vous êtes ok, sinon, NumPy lancers.
la seule exception que j'ai rencontré (il y en a probablement d'autres) est calcul de la matrice inverse.
ci-dessous sont des extraits dans laquelle j'ai appelé une pure algèbre linéaire (en fait, à partir de Numpy de l'Algèbre Linéaire module) et transmis dans un tableau NumPy
déterminant d'un tableau:
vecteurs propres/valeur propre paires:
matrice norme:
factorisation qr:
matrice rang:
matrice condition:
inversion nécessite un NumPy matrice si:
mais la Moore-Penrose pseudo-inverse semble fonctionne très bien
En 3.5, Python enfin eu une multiplication de matrice de l'opérateur. La syntaxe est
a @ b
.Il y a une situation où l'opérateur point sera de donner des réponses différentes lorsque vous traitez avec des tableaux en tant que de traiter avec des matrices. Par exemple, supposons que les suivantes:
Permet de les convertir dans des matrices:
Maintenant, nous pouvons voir une sortie différente pour les deux cas:
De référence de http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html
..., l'utilisation de la numpy.matrice classe est découragé, car elle n'ajoute rien qui ne peut être accomplie avec 2D numpy.ndarray objets, et peut conduire à un confusion de la classe est utilisé. Par exemple,
scipy.linalg opérations peuvent être appliquées de manière égale à numpy.matrice ou 2D numpy.ndarray objets.
Cette astuce pourrait être ce que vous cherchez. C'est une sorte de simple opérateur de surcharge.
Vous pouvez ensuite utiliser quelque chose comme le suggère Infix classe comme ceci:
Pertinente citation de PEP 465 - création d'UN opérateur infixe pour la multiplication matricielle , comme mentionné par @petr-viktorin, éclaire le problème de l'OP était arriver à:
L'introduction de la
@
opérateur infixe devrait aider à unifier et à simplifier python matrice de code.Fonction matmul (depuis numpy 1.10.1) fonctionne bien pour les deux types et le résultat de retour en tant que numpy classe matrix:
De sortie:
Depuis python 3.5 mentionné plus tôt vous pouvez également utiliser une nouvelle matrice de l'opérateur de multiplication
@
commeet obtenir le même résultat que ci-dessus.