9
votes

Initialisation de la matrice multi-dimensionnelle Python sans boucle

existe-t-il un moyen de python pour initialiser un tableau / liste multidimensionnelle sans utiliser de boucle?


1 commentaires

Cette question est légèrement vague: voulez-vous initialiser un tableau multidimensionnel vide ou souhaitez-vous initialiser la matrice multidimensionnelle à un ensemble de valeurs spécifique?


12 Réponses :


2
votes

Cela dépend de ce que vous devez initialiser le tableau, mais sûr. Vous pouvez utiliser une compréhension de liste pour créer un tableau 5 × 3, par exemple:

>>> [[0 for x in range(3)] for y in range(5)]
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

>>> [[3*y+x for x in range(3)] for y in range(5)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14]]


2 commentaires

Cela ne compte pas comme utiliser une boucle?


Docs spécifie-la comme moyen d'initialiser la liste multidimensionnelle. Pour une liste à une dimension, l'initialisation suivante est possible list = [5] * 10 , mais ne peut pas l'obtenir pour travailler avec plus de dimensions. On dirait que lorsque vous faites list = [[5] * 5] * 5 , chaque sous-dimension pointe sur la même mémoire, ce qui n'est pas ce que je veux.



7
votes

Bien sûr, vous pouvez simplement faire

mylist = [
            [1,2,3],
            [4,5,6],
            [7,8,9]
         ]


1 commentaires

Vous avez absolument raison, et je ne demande pas comment cela cherchera une matrice 1000 x 1000 ...



9
votes

Selon vos besoins réels, le package "standard" de facto Numpy pourrait vous fournir exactement ce dont vous avez besoin.

Vous pouvez par exemple créer un tableau multidimensionnel avec p> xxx pré>

(initialisé avec valeurs arbitraires em>) ou créez le même Les matrices avec zéros em> partout avec p>

numpy.zeros((10, 4, 100))


2 commentaires

HM ... ces deux exemples créeraient-ils un tableau de 10 x 4 x 100?


Ils font très certainement. Vous pouvez vérifier cela en faisant a = numpy.empty ((10, 4, 100)); Imprimez A.Shape .



5
votes

Je ne crois pas que ce soit possible.

Vous pouvez faire quelque chose comme ceci: xxx

pour créer une matrice 5x5, mais ce sont des objets répétés (que vous avez Je ne veux pas). Par exemple: xxx

Vous devez presque certainement utiliser une sorte de boucle comme dans: xxx


1 commentaires

>>> a = [[0] * 5] * 5 C'est un peu de danger. C'est peut-être bon si vous utilisez zéro. Mais si vous essayez de poser votre variable. Vous obtenez une liste de listes qui références à la même valeur. Par exemple, lorsque vous définissez un [1] [1] = 5 - toutes la liste auront un élément en position 1!



1
votes

Si vous faites des travaux numériques à l'aide de NUMPY, quelque chose comme

x = numpy.zeros ((m,n))
x = numpy.ones ((m,n))


0 commentaires

13
votes

Assurez-vous est un moyen xxx

ou xxx

mais c'est horrible et gaspillé, alors tout le monde utilise des boucles (généralement des compréhensions de liste) ou numpy


4 commentaires

Le marquant comme accepté comme le mieux reflète la question. NUMPY NE PAS une partie de l'installation standard Python.


Cela a l'inconvénient de créer des références aux mêmes objets, voir Cette réponse


@black_puppydog, non ce n'est pas le cas. C'est pourquoi eval est utilisé ici


Cette réponse explique comment initialiser un tableau multidimensionnel à l'aide de numpy: Stackoverflow.com/a/3662541/975097



3
votes

Recursion est votre ami: d

C'est une jolie implémentation naïve, mais cela fonctionne! P>

dim = [2, 2, 2]

def get_array(level, dimension):
    if( level != len(dimension) ):
        return [get_array(level+1, dimension) for i in range(dimension[level])]
    else:
        return 0

print get_array(0, dim)


1 commentaires

C'est juste ce que j'étais après, merci! Ma seule mise en garde est que je préfère envoyer une matrice de dimension abrégée, au lieu de deux paramètres, comme dans: [Get_array (dimension [1:]) pour J en xrange (dimension [0])]



1
votes

Python n'a pas tableaux . Il a d'autres types de séquence allant des listes aux dictionnaires sans oublier les ensembles - la bonne dépend de vos besoins spécifiques.

Assumer votre "tableau" est en réalité une liste et "Initialiser" signifie affecter une liste de listes de nxm éléments, vous pouvez (pseudocode):

  • Pour N Times: Pour M Times: Ajoutez un élément
  • pour n fois: ajoutez une rangée d'éléments M
  • Écrivez le tout out

    Vous dites que vous ne voulez pas boucler et que cela exclut les deux premiers points, mais pourquoi? Vous dites également que vous ne voulez pas écrire la chose (en réponse à Jacobm), alors comment feriez-vous exactement cela? Je ne connais aucune autre façon d'obtenir une structure de données sans le générer dans des pièces plus petites (boucle) ou de l'écrire explicitement en bas - dans n'importe quel langage de programmation.

    Gardez également à l'esprit qu'une liste initialisée mais vide n'est pas meilleure que la liste, sauf si vous ne mettez de données à elle. Et vous n'avez pas besoin de l'initialiser avant de mettre des données ...

    Si ce n'est pas un exercice théorique, vous demandez probablement la mauvaise question. Je suggère que vous expliquez de quoi avez-vous besoin de faire avec ce tableau.


2 commentaires

Vous allez au fond de certains des points :)) Le point de la question est très simple et demande ce qu'elle demande. Je me demandais de différentes techniques que les personnes utilisaient pour l'initialisation des listes multidimensionnelles et les réponses à la question reflètent parfaitement ce que je voulais savoir. Certaines personnes utilisent Bibliothèque Numpy Standard Numpy . Certaines personnes initialisent des listes à l'aide de pour des boucles évidemment. Comme Jacobm suggère que vous puissiez initialiser statiquement les listes, mais je souligne que cela n'est pas applicable pour les grandes listes. gnibbler suggère un moyen très intéressant mais génial et non efficace.


Je m'interrogeais particulièrement sur l'initialisation sans pour boucles, car il était déjà évident de la documentation de la manière dont vous feriez cela.



2
votes
>>> a
[[1, 2], [2, 3]]

0 commentaires

7
votes

Ce qui suit n'utilise aucune bibliothèque spéciale, ni eval: xxx pré>

et il ne crée pas de références dupliquées: p>

>>> arr[1][1] = 2
>>> arr
[[0, 0, 0, 0, 0],
 [0, 2, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0]]


0 commentaires

-2
votes

Vous pouvez utiliser un tableau N-dimensionnel (Ndarray). Voici le lien vers la documentation. http://docs.scipy.org/doc/numpy/reference/arrays .ndarray.html


0 commentaires

0
votes

Vous pouvez faire de cette façon:

d'abord sans utiliser de boucle: xxx

secondaire à l'aide de la compréhension de liste de lignes directe simple: xxx < / pré>


0 commentaires