Je veux définir un tableau à deux dimensions sans longueur initialisée comme ceci:
Matrix = [][]
mais ça ne marche pas ...
J'ai essayé le code ci-dessous, mais c'est faux aussi:
Matrix = [5][5]
Erreur:
Traceback ...
IndexError: list index out of range
Quelle est mon erreur?
python
matrix
syntax-error
Masoud Abasian
la source
la source
Réponses:
Vous essayez techniquement d'indexer un tableau non initialisé. Vous devez d'abord initialiser la liste externe avec des listes avant d'ajouter des éléments; Python appelle cette "compréhension de liste".
Vous pouvez maintenant ajouter des éléments à la liste:
Notez que la matrice est une adresse "y" majeure, en d'autres termes, "l'index y" précède l '"index x".
Bien que vous puissiez les nommer comme vous le souhaitez, je le vois de cette façon pour éviter toute confusion qui pourrait survenir avec l'indexation, si vous utilisez "x" pour les listes intérieure et extérieure et que vous voulez une matrice non carrée.
la source
range
pour créer directement les listes internes:[range(5) for x in range(5)]
[0] * w
partie est agréable, mais[[0] * w] * h]
produira un comportement inattendu. Essayezmat = [[0] * 3] * 3; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 10, 0], [0, 10, 0]])
etmat = [[0] * 3 for i in range(3)]; mat[0][1] = 10; print(mat == [[0, 10, 0], [0, 0, 0], [0, 0, 0]])
.Si vous voulez vraiment une matrice, vous feriez peut-être mieux de l'utiliser
numpy
. Les opérations matriciellesnumpy
utilisent le plus souvent un type de tableau à deux dimensions. Il existe de nombreuses façons de créer un nouveau tableau; l'une des plus utiles est lazeros
fonction, qui prend un paramètre de forme et renvoie un tableau de la forme donnée, avec les valeurs initialisées à zéro:Voici quelques autres façons de créer des matrices et matrices 2D (avec sortie supprimée pour des raisons de compacité):
numpy
fournit également unmatrix
type, mais il n'est plus recommandé pour aucune utilisation et peut être suppriménumpy
à l'avenir.la source
np.matrix
pour la représenter. La bonne façon de représenter une matrice en numpy est avec unarray
.array
au lieu de matrices. Bien que cela ne soit pas toujours encouragé, il existe des raisons légitimes d'utilisermatrix
- des questions de contexte.matrix
? Depuis que l'@
opérateur a été introduit, il semble y avoir une raison de moins depuis que ce message a été écrit.numpy
documents indiquent maintenant que la classe peut être obsolète et supprimée à l'avenir, donc je l'ai retirée de la réponse.Voici une notation plus courte pour initialiser une liste de listes:
Malheureusement, le raccourcir en quelque chose comme
5*[5*[0]]
ça ne fonctionne pas vraiment parce que vous vous retrouvez avec 5 copies de la même liste, donc quand vous en modifiez une, elles changent toutes, par exemple:la source
[0]*5
?[[0]*5 for _ in range(5)]
avec le compteur de boucles anonyme que vous n'utilisez pas[0]*5
fonctionne très bien. Maintenant, je comprends aussi pourquoi ce[{0}]*8
serait une mauvaise idée.Si vous souhaitez créer une matrice vide, la syntaxe correcte est
Et si vous voulez générer une matrice de taille 5 remplie de 0,
la source
Si tout ce que vous voulez, c'est un conteneur à deux dimensions pour contenir certains éléments, vous pouvez facilement utiliser un dictionnaire à la place:
Ensuite, vous pouvez faire:
Cela fonctionne car
1,2
est un tuple, et vous l'utilisez comme clé pour indexer le dictionnaire. Le résultat est similaire à une matrice creuse et muette.Comme indiqué par osa et Josap Valls, vous pouvez également utiliser
Matrix = collections.defaultdict(lambda:0)
pour que les éléments manquants aient une valeur par défaut de0
.Vatsal souligne en outre que cette méthode n'est probablement pas très efficace pour les grandes matrices et ne devrait être utilisée que dans les parties non critiques des performances du code.
la source
import collections; Matrix = collections.defaultdict(float)
, pour substituer des zéros aux éléments non initialisés.En Python, vous allez créer une liste de listes. Vous n'avez pas à déclarer les dimensions à l'avance, mais vous le pouvez. Par exemple:
Maintenant matrice [0] [0] == 2 et matrice [1] [0] == 3. Vous pouvez également utiliser la syntaxe de compréhension de liste. Cet exemple l'utilise deux fois pour créer une "liste bidimensionnelle":
la source
extend
serait également utile dans le premier cas: si vous commencez parm = [[]]
, vous pouvez ajouter à la liste interne (étendre une ligne) avecm[0].extend([1,2])
et ajouter à la liste externe (ajouter une nouvelle ligne) avecm.append([3,4])
, ces opérations vous laisseront avec[[1, 2], [3, 4]]
.La réponse acceptée est bonne et correcte, mais il m'a fallu un certain temps pour comprendre que je pouvais également l'utiliser pour créer un tableau complètement vide.
résulte en
la source
Vous devriez faire une liste de listes, et la meilleure façon est d'utiliser des compréhensions imbriquées:
Sur votre
[5][5]
exemple, vous créez une liste avec un entier "5" à l'intérieur et essayez d'accéder à son 5ème élément, ce qui déclenche naturellement une IndexError car il n'y a pas de 5ème élément:la source
Pourquoi un code aussi long, que
Python
vous demandez aussi?Il y a longtemps, quand je n'étais pas à l'aise avec Python, j'ai vu les réponses sur une seule ligne pour écrire une matrice 2D et je me suis dit que je n'utiliserais plus la matrice 2D en Python. (Ces lignes simples étaient assez effrayantes et cela ne m'a donné aucune information sur ce que faisait Python. Notez également que je ne suis pas au courant de ces raccourcis.)
Quoi qu'il en soit, voici le code pour un débutant dont les origines C, CPP et Java
Remarque pour les amateurs et les experts de Python: veuillez ne pas voter contre simplement parce que j'ai écrit un code détaillé.
la source
Une réécriture pour une lecture facile:
la source
Utilisation:
Le * 5 pour la première dimension fonctionne car à ce niveau les données sont immuables.
la source
matrix = [[0]*cols for _ in range(rows)]
Pour déclarer une matrice de zéros (uns):
par exemple
ou numpy.ones ((x, y)) par exemple
Même trois dimensions sont possibles. ( http://www.astro.ufl.edu/~warner/prog/python.html voir -> Tableaux multidimensionnels)
la source
C'est ainsi que je crée habituellement des tableaux 2D en python.
Je trouve cette syntaxe facile à retenir par rapport à l'utilisation de deux boucles for dans une compréhension de liste.
la source
Je suis sur mon premier script Python, et j'étais un peu confus par l'exemple de la matrice carrée, donc j'espère que l'exemple ci-dessous vous aidera à gagner du temps:
pour que
la source
En utilisant NumPy, vous pouvez initialiser une matrice vide comme ceci:
Et plus tard, ajoutez des données comme ceci:
la source
Je lis dans des fichiers séparés par des virgules comme ceci:
La liste "data" est alors une liste de listes avec des données d'index [row] [col]
la source
Si vous voulez pouvoir le penser comme un tableau 2D plutôt que d'être contraint de penser en termes de liste de listes (beaucoup plus naturel à mon avis), vous pouvez faire ce qui suit:
Le résultat est une liste (pas un tableau NumPy), et vous pouvez remplacer les positions individuelles par des nombres, des chaînes, etc.
la source
numpy.matrix
équivalents ànumpy.zeros
sans zéros sans être listés?C'est pour ça que le dictionnaire est fait!
Vous pouvez définir des clés et des valeurs de deux manières:
ou
Résultat:
la source
Utilisation:
Je pense que NumPy est la voie à suivre. Ce qui précède est générique si vous ne souhaitez pas utiliser NumPy.
la source
en utilisant la liste:
en utilisant dict: vous pouvez également stocker ces informations dans la table de hachage pour une recherche rapide comme
la matrice ['1'] vous donnera le résultat en O (1) temps
* nb : vous devez gérer une collision dans la table de hachage
la source
Si vous n'avez pas d'informations sur la taille avant de commencer, créez deux listes unidimensionnelles.
Stockez la ligne entière dans la 1ère liste. Une fois terminé, ajoutez la liste 1 à la liste 2:
Production:
la source
Faites attention à cette courte expression, voir l'explication complète dans la réponse de @ FJ
la source
Matrix[0], Matrix[1], ..., Matrix[4]
tous pointent vers le même tableau, donc aprèsMatrix[0][0] = 3
, vous vous attendezMatrix[0][0] == Matrix[1][0] == ... == Matrix[4][0] == 3
.Sera plus rapide que:
la source
[[0]*(L) for i in range(W)]
devrait également être utilisé[[0]*(L) for _ in range(W)]
cari
n'est utilisé nulle partVous pouvez créer une liste bidimensionnelle vide en imbriquant au moins deux contreventements carrés ou un troisième crochet (
[]
séparés par une virgule) avec un contreventement carré, comme ci-dessous:Supposons maintenant que vous vouliez ajouter 1 à
Matrix[0][0]
puis tapez:Maintenant, tapez Matrix et appuyez sur Entrée. La sortie sera:
la source
Essaye ça:
la source
Si vous avez besoin d'une matrice avec des nombres prédéfinis, vous pouvez utiliser le code suivant:
la source
Voici l'extrait de code pour créer une matrice en python:
Veuillez suggérer si j'ai oublié quelque chose.
la source