Quelles sont les différences entre numpy les tableaux et les matrices? Qui dois-je utiliser?
Quels sont les avantages et les inconvénients de chacune?
De ce que j'ai vu, soit on peut travailler comme un remplacement pour l'autre en cas de besoin, de sorte que je devrais toujours à l'aide de deux ou dois-je en tenir à un seul d'entre eux?
Sera le style du programme d'influencer mon choix? Je fais un certain apprentissage de la machine à l'aide de numpy, donc il y a en effet beaucoup de matrices, mais aussi beaucoup de vecteurs (des tableaux).
- Je n'ai pas assez de renseignements pour justifier une réponse, mais de ce que je peux dire la différence principale est la mise en œuvre de la multiplication. Une matrice effectue matrice/tenseur de la multiplication, alors qu'un tableau fera élément-sage de multiplication.
- Python 3.5 ajouté le infix @ opérateur de multiplication de matrice (PEP 465), et NumPy 1.10 ajout du support pour cela. Donc, si vous utilisez Python 3.5+ et NumPy 1.10+, alors vous pouvez simplement écrire
A @ B
au lieu deA.dot(B)
, oùA
etB
sont en 2Dndarray
s. Cela supprime le principal avantage de l'utilisation dematrix
au lieu de la plainendarray
s, à mon humble avis.
Vous devez vous connecter pour publier un commentaire.
Numpy matrices sont strictement en 2 dimensions, tandis que les tableaux numpy (ndarrays) sont
À N dimensions. La matrice des objets sont une sous-classe de ndarray, de sorte qu'ils héritent de toutes les
les attributs et les méthodes de ndarrays.
Le principal avantage de numpy matrices est qu'ils fournissent une pratique de la notation
pour la multiplication matricielle: si a et b sont des matrices, alors a*b est leur matrice
produit.
D'autre part, en tant que de Python 3.5, NumPy prend en charge infix de multiplication de matrice à l'aide de la
@
de l'opérateur, de sorte que vous pouvez obtenir le même confort de multiplication de matrice avec ndarrays en Python >= 3.5.La matrice à la fois des objets et des ndarrays ont
.T
pour retourner la transposition, mais la matriceles objets ont également
.H
pour le conjugué transposer, et.I
de l'inverse.En revanche, les tableaux numpy constante de respecter la règle que les opérations sont
appliquée à l'élément de sage (sauf pour la nouvelle
@
opérateur). Ainsi, sia
etb
sont des tableaux numpy, puisa*b
est la matrice deformé en multipliant les composants de l'élément de sage:
Pour obtenir le résultat de la multiplication de matrice, vous utilisez
np.dot
(ou@
en Python >= 3.5, comme illustré ci-dessus):La
**
opérateur se comporte différemment:Depuis
a
est une matrice,a**2
renvoie la matrice produita*a
.Depuis
c
est un ndarray,c**2
retourne un ndarray avec chaque composant au carréélément-sage.
Il y a d'autres différences techniques entre la matrice des objets et des ndarrays
(avoir à faire avec np.ravel, la sélection de l'élément et le comportement de séquence).
Le principal avantage des tableaux numpy, c'est qu'ils sont plus générales que
2-dimensions des matrices. Ce qui se passe lorsque vous voulez un 3-dimensions tableau? Alors
vous devez utiliser un ndarray, pas un objet de la matrice. Ainsi, l'apprentissage de l'utilisation de la matrice
objets est plus de travail-que vous avez à apprendre de la matrice objet d'opérations, et
ndarray opérations.
Écrire un programme qui utilise à la fois les matrices et les tableaux rend la vie difficile
parce que vous devez garder une trace de ce type de l'objet à vos variables sont, de peur que
la multiplication de retour quelque chose que vous n'attendiez pas.
En revanche, si vous vous en tenez uniquement avec ndarrays, alors vous pouvez tout faire
la matrice des objets peut faire, et de plus, à l'exception légèrement différentes
fonctions/notation.
Si vous êtes prêt à renoncer à l'attrait visuel de NumPy produit matriciel
la notation (qui peut être atteint presque avec autant d'élégance avec ndarrays en Python >= 3.5), alors je pense que NumPy les tableaux sont certainement le chemin à parcourir.
PS. Bien sûr, vous vraiment n'avez pas à choisir l'un au détriment de l'autre,
depuis
np.asmatrix
etnp.asarray
vous permettent de convertir de l'un à l'autre (commelongtemps que le tableau est en 2 dimensions).
Il y a un résumé des différences entre NumPy
arrays
vs NumPymatrix
es ici.mat**n
pour une matrice peut être inélégante appliquée à un tableau avecreduce(np.dot, [arr]*n)
np.linalg.matrix_power(mat, n)
np.dot(array2, array2)
sont plus rapides quematrix1*matrix2
. Cela a un sens parce quematrix
est une sous-classe de ndarray qui remplace des méthodes spéciales comme__mul__
.matrix.__mul__
appelsnp.dot
. Donc, il est le code reusage ici. Au lieu d'effectuer moins de contrôles, à l'aide dematrix*matrix
nécessite une fonction d'appel. Donc l'avantage de l'utilisation dematrix
est purement syntaxique, pas de meilleures performances.Scipy.org vous recommande d'utiliser des tableaux:
ndarray
. Le principal argument pour l'utilisation dematrix
serait si votre code est lourd en algèbre linéaire et en aurait l'air moins évident avec tous les appels à ladot
fonction. Mais cet argument disparaît dans l'avenir, maintenant que l'opérateur @est acceptée pour une utilisation avec la multiplication de matrice, voir PEP 465. Il faudra pour cela Python 3.5 et la dernière version de Numpy. La matrice de classe peut être déconseillé dans le futur, afin de mieux utiliser ndarray pour le nouveau code ...scipy.sparse
matrices. Si vous utilisez à la fois dense & matrices creuses dans votre code, il est beaucoup plus facile à tenir àmatrix
.Juste pour ajouter un cas à l'unutbu de la liste.
L'une des plus grandes différences concrètes pour moi de numpy ndarrays par rapport à numpy matrices ou de la matrice des langues comme matlab, c'est que la dimension n'est pas conservé à réduire ses activités. Les Matrices sont toujours en 2d, alors que la moyenne d'un tableau, par exemple, a une dimension de moins en moins.
Par exemple rabaisser les lignes d'une matrice ou d'un tableau:
avec la matrice
avec le tableau
Je pense aussi que le mélange des tableaux et des matrices donne lieu à de nombreux "heureux" de débogage heures.
Cependant, scipy.matrices creuses sont toujours les matrices en termes d'opérateurs, comme la multiplication.
Comme d'autres l'ont mentionné, peut-être le principal avantage de
matrix
était qu'il offrait une pratique de la notation pour la multiplication matricielle.Cependant, en Python 3.5, il est enfin dédié opérateur infixe pour la multiplication matricielle:
@
.Avec les récentes NumPy versions, il peut être utilisé avec
ndarray
s:Ainsi, de nos jours, encore plus, en cas de doute, vous devez vous en tenir à
ndarray
.