Numpy matrices sont strictement bidimensionnels, tandis que numpy tableaux (ndarrays) sont N-dimensionnelles. Les objets Matrix 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 de matrices : si a et b sont des matrices, alors a*b
est leur produit matriciel produit.
import numpy as np
a = np.mat('4 3; 2 1')
b = np.mat('1 2; 3 4')
print(a)
# [[4 3]
# [2 1]]
print(b)
# [[1 2]
# [3 4]]
print(a*b)
# [[13 20]
# [ 5 8]]
D'autre part, à partir de Python 3.5, NumPy prend en charge la multiplication de matrices infixes à l'aide de la fonction @
de sorte que vous pouvez obtenir la même commodité de multiplication matricielle avec des ndarrays dans Python >= 3.5.
import numpy as np
a = np.array([[4, 3], [2, 1]])
b = np.array([[1, 2], [3, 4]])
print(a@b)
# [[13 20]
# [ 5 8]]
Les objets matriciels et les ndarrays ont tous les deux .T
pour retourner la transposition, mais les objets matriciels ont également .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éments (à l'exception de new). sont appliquées élément par élément (sauf pour la nouvelle @
). Ainsi, si a
et b
sont des tableaux numpy, alors a*b
est le tableau formé par la multiplication des composants par élément :
c = np.array([[4, 3], [2, 1]])
d = np.array([[1, 2], [3, 4]])
print(c*d)
# [[4 6]
# [6 4]]
Pour obtenir le résultat d'une multiplication matricielle, on utilise np.dot
(ou @
dans Python >= 3.5, comme indiqué ci-dessus) :
print(np.dot(c,d))
# [[13 20]
# [ 5 8]]
Le site **
se comporte également différemment :
print(a**2)
# [[22 15]
# [10 7]]
print(c**2)
# [[16 9]
# [ 4 1]]
Depuis a
est une matrice, a**2
renvoie le produit matriciel a*a
. Puisque c
est un ndarray, c**2
renvoie un ndarray avec chaque composant élevé au carré par élément.
Il existe d'autres différences techniques entre les objets matriciels et les ndarrays (en rapport avec np.ravel
la 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 à 2 dimensions . Que se passe-t-il lorsque vous voulez un tableau à 3 dimensions ? Dans ce cas, vous devez utiliser un ndarray, et non un objet matrice. Ainsi, apprendre à utiliser matrix matricielle demande plus de travail - vous devez apprendre les opérations sur les objets matriciels et les opérations sur les tableaux. les opérations sur les ndarray.
Écrire un programme qui mélange à la fois des matrices et des tableaux vous rend la vie difficile parce que vous devez garder la trace du type d'objet de vos variables, de peur que la multiplication ne renvoie quelque chose d'inattendu.
En revanche, si vous vous en tenez uniquement aux ndarrays, vous pouvez faire tout ce que les objets matriciels peuvent faire et plus encore, mais avec des caractéristiques légèrement différentes. ce que les objets matriciels peuvent faire, et plus encore, mais avec des fonctions/notations fonctions/notation légèrement différentes.
Si vous êtes prêt à renoncer à l'attrait visuel de la notation du produit matriciel NumPy (qui peut être obtenue de manière presque aussi élégante avec ndarrays dans Python >= 3.5), alors je pense que les tableaux NumPy sont définitivement la voie à suivre.
PS. Bien sûr, vous n'êtes pas obligé de choisir l'un au détriment de l'autre, puisque np.asmatrix
et np.asarray
vous permettent de convertir l'un en l'autre (à condition que le tableau est bidimensionnel).
Il y a un synopsis des différences entre NumPy arrays
vs NumPy matrix
es ici .
3 votes
Je n'ai pas assez d'informations pour justifier une réponse mais d'après ce que je peux dire, la principale différence est l'implémentation de la multiplication. Une matrice effectue une multiplication matricielle/tensorielle, tandis qu'un tableau effectue une multiplication par élément.
9 votes
Python 3.5 a ajouté l'opérateur infixe @ pour la multiplication matricielle (PEP 465), et NumPy 1.10 a ajouté le support de cet opérateur. Donc, si vous utilisez Python 3.5+ et NumPy 1.10+, vous pouvez simplement écrire
A @ B
au lieu deA.dot(B)
oùA
etB
sont des 2Dndarray
s. Cela supprime le principal avantage de l'utilisation dematrix
au lieu d'un simplendarray
s, IMHO.