La matrice d'indexation dans Numpy
J'était de plus en plus confuse au cours de l'élaboration d'un petit script Python impliquant des opérations matricielles, j'ai donc tiré un obus de jouer avec un jouet exemple et de développer une meilleure compréhension de la matrice d'indexation dans Numpy.
C'est ce que j'ai fait:
>>> import numpy as np
>>> A = np.matrix([1,2,3])
>>> A
matrix([[1, 2, 3]])
>>> A[0]
matrix([[1, 2, 3]])
>>> A[0][0]
matrix([[1, 2, 3]])
>>> A[0][0][0]
matrix([[1, 2, 3]])
>>> A[0][0][0][0]
matrix([[1, 2, 3]])
Comme vous pouvez l'imaginer, cela a pas m'a aidé à développer une meilleure compréhension de la matrice d'indexation dans Numpy. Ce comportement aurait du sens pour quelque chose que je décrirais comme "Un tableau de lui-même", mais je doute que quelqu'un dans son esprit droit serait choisir que comme un modèle pour les matrices dans une bibliothèque scientifique.
Ce qui est, ensuite, la logique de la sortie, j'ai obtenu? Pourquoi le premier élément d'une matrice de l'objet lui-même?
PS: je sais comment faire pour obtenir la première entrée de la matrice. Ce qui m'intéresse, c'est la logique derrière cette décision de conception.
EDIT: je ne suis pas demandant comment accéder à un élément de la matrice, ou pourquoi une ligne de matrice se comporte comme une matrice. Je vous demande une définition du comportement de la matrice lors de indexés avec un numéro unique. Il s'agit d'une action typique de tableaux, mais le comportement qui en résulte n'en est rien, comme celui que vous attendez d'un tableau. Je voudrais savoir comment cela est mis en place et quelle est la logique derrière la décision de conception.
- La syntaxe est Un[dim1, dim2, ...]. Pour ce cas, pour obtenir le premier élément, vous feriez Un[0,0], deuxième élément de[0,1] et le troisième élément de[0,2]. C'est un 1 x 3 de la matrice.
- Personne n'a vraiment lu le PS?
- Le
matrix
classe est codé en dur pour les avoir toujours deux dimensions (lignes et colonnes). C'est préservée par tranchage et des opérations d'indexation (sauf si vous accédez à un seul élément, par exempleA[0, 0]
). Par ailleurs, pour la plupart des utilisations, lendarray
classe (c'est à dire la norme tableau numpy) est préféré; recherchenumpy array vs matrix
de trouver beaucoup de discussions sur ce sujet. - quand j'ai d'abord besoin de faire de la matrice de maths dans numpy toute l'aide que j'ai pu trouver m'a dirigé vers l'utilisation ndarray. Il est beaucoup plus souple et pour chacune des choses que j'ai testé c'était plus rapide.
Vous devez vous connecter pour publier un commentaire.
Regarder la forme après l'indexation:
La clé de ce comportement est que
np.matrix
est toujours en 2d. Donc, même si vous sélectionnez une ligne (A[0,:]
), le résultat est toujours en 2d, la forme(1,3)
. De sorte que vous pouvez prendre autant de[0]
que vous le souhaitez, et rien de nouveau ne se passe.- Ce que vous essayez d'accomplir avec
A[0][0]
? Le même queA[0,0]
?Pour la base
np.ndarray
classe ils sont équivalents.Noter que
Python
interprète traduit de l'indexation de__getitem__
appels.[0][0]
est de 2 opérations d'indexation, pas un seul. Donc l'effet de la deuxième[0]
dépend de ce que le premier produit.Pour un tableau
A[0,0]
est équivalent àA[0,:][0]
. Mais pour une matrice, ce que vous devez faire:=============================
À la lumière de ces commentaires, permettez-moi de suggérer quelques précisions.
A[0]
ne signifie pas "de retour le 1er élément". Cela signifie sélectionner le 1er axe. Pour un tableau 1d cela signifie que le 1er élément. Pour un tableau 2d, il signifie la 1ère ligne. Pourndarray
ce serait un tableau 1d, mais pour unmatrix
c'est un autrematrix
. Donc pour un tableau 2d ou de la matrice,A[i,:]
est la même chose queA[i]
.A[0]
n'est pas juste de retour lui-même. Il retourne une nouvelle matrice. Différentsid
:Il peut avoir les mêmes données, la forme et le progrès, mais c'est un nouvel objet. Il est tout aussi unique que la
ith
ligne d'un nombre de lignes de la matrice.Plus de l'unique
matrix
activité est définie dans:numpy/matrixlib/defmatrix.py
. J'allais suggérer de regarder lamatrix.__getitem__
méthode, mais la plupart de l'action est effectuée dansnp.ndarray.__getitem__
.np.matrix
classe a été ajoutée ànumpy
comme une commodité pour les old-school MATLAB programmeurs.numpy
les tableaux peuvent avoir presque n'importe quel nombre de dimensions, 0, 1, .... MATLAB a permis seulement 2, si un communiqué autour de 2000 généralisée à 2 ou plus.Imaginez que vous avez le suivant
Si vous voulez obtenir la deuxième colonne de la valeur, utilisez la commande suivante: