Quels sont les avantages et les inconvénients de chacun?
D'après ce que j'ai vu, l'un ou l'autre peut fonctionner en remplacement de l'autre si nécessaire, alors devrais-je prendre la peine d'utiliser les deux ou devrais-je m'en tenir à l'un d'entre eux?
Le style du programme influencera-t-il mon choix? Je fais un peu d'apprentissage automatique en utilisant numpy, donc il y a en effet beaucoup de matrices, mais aussi beaucoup de vecteurs (tableaux).
A @ B
place deA.dot(B)
, oùA
etB
sont des 2Dndarray
. Cela supprime le principal avantage de l'utilisationmatrix
au lieu dendarray
s simples , à mon humble avis.Réponses:
Selon les documents officiels, il n'est plus conseillé d'utiliser la classe de matrice car elle sera supprimée à l'avenir.
https://numpy.org/doc/stable/reference/generated/numpy.matrix.html
Comme d'autres réponses indiquent déjà que vous pouvez réaliser toutes les opérations avec les tableaux NumPy.
la source
Les matrices numpy sont strictement bidimensionnelles, tandis que les tableaux numpy numpy (ndarrays) sont N-dimensionnels. Les objets matriciels sont une sous-classe de ndarray, ils héritent donc de tous les attributs et méthodes des ndarrays.
Le principal avantage des matrices numpy est qu'elles fournissent une notation pratique pour la multiplication matricielle: si a et b sont des matrices, alors
a*b
est leur produit matriciel.D'un autre côté, à partir de Python 3.5, NumPy prend en charge la multiplication de matrice infixe à l'aide de l'
@
opérateur, de sorte que vous pouvez obtenir la même commodité de multiplication matricielle avec ndarrays en Python> = 3.5.Les objets matriciels et les ndarrays doivent tous
.T
les deux renvoyer la transposition, mais les objets matriciels doivent également être utilisés.H
pour la transposition conjuguée et.I
pour l'inverse.En revanche, les tableaux numpy respectent systématiquement la règle selon laquelle les opérations sont appliquées par élément (sauf pour le nouvel
@
opérateur). Ainsi, sia
etb
sont des tableaux numpy, alorsa*b
le tableau est formé en multipliant les composants par élément:Pour obtenir le résultat de la multiplication matricielle, vous utilisez
np.dot
(ou@
en Python> = 3,5, comme indiqué ci-dessus):L'
**
opérateur se comporte également différemment:Puisque
a
est une matrice,a**2
renvoie le produit matriciela*a
. Puisquec
est un ndarray,c**2
retourne un ndarray avec chaque composant au carré élément par élément.Il existe d'autres différences techniques entre les objets matriciels et les ndarrays (concernant la
np.ravel
sélection des éléments et le comportement des séquences).Le principal avantage des tableaux numpy est qu'ils sont plus généraux que les matrices bidimensionnelles . Que se passe-t-il lorsque vous voulez un tableau en 3 dimensions? Ensuite, vous devez utiliser un ndarray, pas un objet matrice. Ainsi, apprendre à utiliser des objets matriciels est plus de travail - vous devez apprendre les opérations des objets matriciels et les opérations ndarray.
Écrire un programme qui mélange à la fois des matrices et des tableaux vous rend la vie difficile car vous devez garder une trace du type d'objet de vos variables, de peur que la multiplication ne renvoie quelque chose que vous n'attendez pas.
En revanche, si vous vous en tenez uniquement aux ndarrays, vous pouvez faire tout ce que les objets matriciels peuvent faire, et plus, sauf avec des fonctions / notation légèrement différentes.
Si vous êtes prêt à renoncer à l'attrait visuel de la notation des produits matriciels NumPy (qui peut être atteint presque aussi élégamment avec des ndarrays en Python> = 3,5), alors je pense que les tableaux NumPy sont certainement la voie à suivre.
PS. Bien sûr, vous n'avez vraiment pas à en choisir un au détriment de l'autre,
np.asmatrix
etnp.asarray
vous permettant de convertir l'un à l'autre (tant que le tableau est en 2 dimensions).Il y a un résumé des différences entre NumPy
arrays
et NumPymatrix
es ici .la source
mat**n
pour une matrice peut être appliquée de manière nonreduce(np.dot, [arr]*n)
np.linalg.matrix_power(mat, n)
np.dot(array2, array2)
sont plus rapides quematrix1*matrix2
. Cela a du sens carmatrix
c'est une sous-classe de ndarray qui remplace les méthodes spéciales comme__mul__
.matrix.__mul__
les appelsnp.dot
. Il y a donc une réutilisation du code ici. Au lieu d'effectuer moins de vérifications, l'utilisationmatrix*matrix
nécessite un appel de fonction supplémentaire. L'avantage de l'utilisationmatrix
est donc purement syntaxique, pas de meilleures performances.Scipy.org vous recommande d'utiliser des tableaux:
la source
ndarray
. L'argument principal pour l'utilisationmatrix
serait si votre code est lourd en algèbre linéaire et semble moins clair avec tous les appels à ladot
fonction. Mais cet argument disparaîtra à l'avenir, maintenant que @ -operator est accepté pour une utilisation avec la multiplication matricielle, voir PEP 465 . Cela nécessitera Python 3.5 et la dernière version de Numpy. La classe matricielle pourrait être déconseillée dans un avenir lointain, il vaut donc mieux utiliser ndarray pour le nouveau code ...scipy.sparse
matrices. Si vous utilisez à la fois des matrices denses et clairsemées dans votre code, il est beaucoup plus facile de s'y tenirmatrix
.Juste pour ajouter un cas à la liste d'unutbu.
L'une des plus grandes différences pratiques pour moi des ndarrays numpy par rapport aux matrices numpy ou aux langages matriciels comme matlab, est que la dimension n'est pas préservée dans les opérations de réduction. Les matrices sont toujours 2D, tandis que la moyenne d'un tableau, par exemple, a une dimension de moins.
Par exemple, rabaisser les lignes d'une matrice ou d'un tableau:
avec matrice
avec tableau
Je pense également que le mélange de tableaux et de matrices donne lieu à de nombreuses heures de débogage "heureuses". Cependant, les matrices scipy.sparse sont toujours des matrices en termes d'opérateurs comme la multiplication.
la source
Comme d'autres l'ont mentionné, le principal avantage de
matrix
cette méthode est peut-être qu'elle fournit une notation pratique pour la multiplication matricielle.Cependant, dans Python 3.5, il existe enfin un opérateur d'infixe dédié pour la multiplication matricielle :
@
.Avec les versions récentes de NumPy, il peut être utilisé avec
ndarray
s:De nos jours, encore plus, en cas de doute, vous devez vous en tenir
ndarray
.la source