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.
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'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.
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 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, si a
et b
sont des tableaux numpy, alors a*b
le tableau est formé en multipliant les 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 de la multiplication matricielle, vous utilisez np.dot
(ou @
en Python> = 3,5, comme indiqué ci-dessus):
print(np.dot(c,d))
# [[13 20]
# [ 5 8]]
L' **
opérateur se comporte également différemment:
print(a**2)
# [[22 15]
# [10 7]]
print(c**2)
# [[16 9]
# [ 4 1]]
Puisque a
est une matrice, a**2
renvoie le produit matriciel a*a
. Puisque c
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
et np.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 NumPy matrix
es ici .