Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide Tableau dimension varaible

    14 février 2017 à 23:04:38

    Bonjour la communauté,

    Je me rapproche de vous car j'ai le problème suivant. 

    Je dispose d'un tableau de dimension 3. La première et seconde dimension définissent une grille. Je voudrais ensuite pouvoir définir une liste dans chaque case : par défaut, elle contiendrait [0,0,0,0]  mais elle pourrait être plus longue (on peut imaginer qu'elle contienne 3 éléments : [2,3,4,5] , [1,2,3,4] , [8,8,8,0]  ). Et là les problèmes apparaissent. 

    Je pensais définir en premier lieu une matrice : mat = numpy.zeros((TailleVert, TailleHory, 4)). Je suis alors dans la configuration initiale. A présent, est-il possible de rajouter, par exemple, les 3 éléments dans une case (i,j) de la grille comme cela : mat[i,j] = [2,3,4,5] , [1,2,3,4] , [8,8,8,0]  (en écrasant la valeur initiale [0,0,0,0] ).  Python ne semble pas être très d'accord :/ 

    Faut-il séparer la grille "des données de la 3e dimension" ? 

    J'ai vu qu'il existait la fonction append mais je n'ai pas réussi à faire ce que je voulais.

    Merci d'avance de votre aide,

    Bonne soirée,

    Alex

    • Partager sur Facebook
    • Partager sur Twitter
      15 février 2017 à 1:00:24

      Je n'arrive pas a comprendre ce qu'il te manque. Je te montre comment on peut faire.

      mat[start:stop][start:stop] = [2,3,4,5] , [1,2,3,4] , [8,8,8,0]



      -
      Edité par makdum 15 février 2017 à 1:07:41

      • Partager sur Facebook
      • Partager sur Twitter
        15 février 2017 à 9:11:59

        Salut makdum,

        Merci de ta réponse mais ce n'est pas ce que je cherche à faire. Je voudrais pouvoir placer plusieurs éléments dans une seul case. Ce que tu me proposes va les placer dans trois cases différentes.

        Ce que je voudrais en faite est d'avoir une grille (matrice nxm) dans laquelle je puisse mettre des éléments de taille variable : la case pourrait être vide ou contenir par exemple [2,3,4,5] , [1,2,3,4] , [8,8,8,0] . 


        Merci :)

        • Partager sur Facebook
        • Partager sur Twitter
          15 février 2017 à 10:21:19

          Sans utiliser numpy ça ne pose aucun problème :

          mat = [[0 for i in range(3)] for i in range(3)]
          # [
          # 	[0, 0, 0],
          # 	[0, 0, 0],
          # 	[0, 0, 0]
          # ]
          
          mat[1][1] = [[1, 2, 3], [4, 5, 6]]

          Par contre avec numpy il faut, à l'initialisation de numpy.zeros, préciser dtype=object pour pouvoir remplacer un élément par une liste ou une liste de listes, (ou n'importe quoi, une string, etc.) :

          import numpy
          
          mat = numpy.zeros((3, 3), dtype=object)
          
          mat[1, 1] = [[1, 2, 3], [4, 5, 6]]


          Je suppose que sans ça tu as dû obtenir une erreur ("Python ne semble pas être d'accord".....) :

          ValueError: setting an array element with a sequence

          -
          Edité par noobien 15 février 2017 à 10:23:34

          • Partager sur Facebook
          • Partager sur Twitter
            15 février 2017 à 20:31:04

            Salut Noobien,

            Merci de ta réponse. La deuxième solution correspond exactement à ce que je voulais. 

            Je préfère utiliser les tableaux car l'accès à un élément de la grille se fait en temps quasi constant contrairement aux listes. 

            Ce me conduit à une nouvelle question. Par exemple, lorsque j'extraits une partie de la grille, je tombe sur disons a (ndarray): 

            a = [[array([[  73.,    0.,  551.,    0.]]) 0]
             [0 0]]

            Je voudrais effectuer maintenant parcourir a. Mais vu que l'élément peut varier (soit un intéger = '0', soit un array), cela m'amène à dissocier les cas. Je pensais gérer le problème avec des exceptions : try ... except... 

            N'y a-t-il pas un moyen plus propre de parcourir a en fonction du type d'élément (liste ou intéger) ?

            Par ailleurs, j'ai remplis les cases vides de la grille avec un '0' pour pouvoir utiliser la fonction 'numpy.nonzeros' car si je ne dis pas de bêtises, il n'est pas possible de construire une matrice "vide" ?

            Merci de votre aide,

            Bonne soirée,

            Alex

            • Partager sur Facebook
            • Partager sur Twitter
              15 février 2017 à 20:42:26

              VTTiste09 a écrit:

              Je voudrais effectuer maintenant parcourir a. Mais vu que l'élément peut varier (soit un intéger = '0', soit un array), cela m'amène à dissocier les cas. Je pensais gérer le problème avec des exceptions : try ... except... 

              N'y a-t-il pas un moyen plus propre de parcourir a en fonction du type d'élément (liste ou intéger) ?

              En utilisant isinstance() ?

              for line in mat:
                  for elt in line:
                      if isinstance(elt, list):
                          # ...

              VTTiste09 a écrit:

              Par ailleurs, j'ai remplis les cases vides de la grille avec un '0' pour pouvoir utiliser la fonction 'numpy.nonzeros' car si je ne dis pas de bêtises, il n'est pas possible de construire une matrice "vide" ?

              Voir numpy.empty https://docs.scipy.org/doc/numpy/reference/generated/numpy.empty.html

              • Partager sur Facebook
              • Partager sur Twitter
                16 février 2017 à 13:21:02

                Salut Noobien,

                Merci de ton aide, c'est ce que je cherchais :). 

                En bidouillant, je vais de petits problèmes en petits problèmes. Cela m'amène au suivant qui n'a aucun rapport avec le sujet initial : lorsque je modifie la copie d'une liste dans une fonction, la liste initiale est également modifiée : 

                a = np.zeros((5,5),dtype = object)
                
                a[3,3] = [[1,2,3,4],[4,5,6,7]]
                
                def Test(a):
                    b = a.copy()
                    del b[3,3][0]
                    print(a)

                Et je me retrouve avec a d'également modifié. Si l'on créé une copie, ne sommes nous pas censé retrouver deux objets indépendants? Comment évter ce petit désagrément ?

                Merci d'avance,

                Alex :)

                • Partager sur Facebook
                • Partager sur Twitter
                  16 février 2017 à 13:36:30

                  Salut,

                  Utilise deepcopy :

                  #!usr/bin/python
                  
                  import numpy as np
                  from copy import deepcopy
                  
                  a = np.zeros((5, 5), dtype=object)
                  a[3, 3] = [[1, 2, 3, 4], [5, 6, 7, 8]]
                  
                  def Test(x):
                  	y = deepcopy(x)
                  	del y[3, 3][0]
                  
                  Test(a)
                  
                  print(a)
                  # [[0 0 0 0 0]
                  #  [0 0 0 0 0]
                  #  [0 0 0 0 0]
                  #  [0 0 0 [[1, 2, 3, 4], [5, 6, 7, 8]] 0]
                  #  [0 0 0 0 0]]

                  -
                  Edité par noobien 16 février 2017 à 13:37:01

                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 février 2017 à 20:52:47

                    Super noobien. Merci pour tes réponses rapides. 

                    A bientôt pour de nouvelles galères ;)

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Aide Tableau dimension varaible

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown