Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment supprimer ligne(s) ou colonne(s) matrice

    7 juin 2024 à 23:39:30

    Bonjour,

    matrice carrée de taille n (variable). Après transformation, cette matrice peut contenir des lignes (ou colonnes) avec que des zéros. Il faut virer ces lignes.

    Je sais tester un élément, l[i][j] ==0 mais je ne sais pas tester une ligne " l[i]==0" c'est toujours false me semble. l[i]==[0,0,0] pas possible car la matrice change de dimensions en fonction du besoins.

    Comment faire?

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      8 juin 2024 à 3:08:48

      Comme tu sembles débuter, je ne te donnerai pas de trucs avancés.
      Il faut tester les éléments un à un de chaque ligne ou chaque colonne et compter le nombre de valeurs nulles.
      Si le nombre d'élément nuls est égal au nombretotal d'éléments dans la ligne ou la colonne, on peut l'éliminer.
      Mais, attention, en faisant cela, on risque de fausser l'indexation et avoir un erreur de type IndexError.
      On doit le faire à partir de la fin vers le début. Exemple:
      -
      nl = ... # Nombre de lignes.
      nc = ... # Nombre de colonnes.
      # Effacer une ligne vide.
      for l in range(nl-1, -1, -1):     # On parcours les lignes en partant de la fin.
          z = 0
          for c in range(nc):     # Ici, la direction est sans importance.
              if matrice[l][c] == 0: z += 1
          if z == nc: del(matrice[l])      # On efface toute la ligne d'un seul coup.
      # Effacer une colonne vide.
      for c in range(nc-1, -1, -1):     # Encore à l'envers.
          z = 0
          for l in range(nl):
              if matrice[l][c] == 0: z += 1
          if z == nl:
              for l in range(nl):     # Ici, on doit effacer un élément à la fois.
                  del(matrice[l][c])
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        8 juin 2024 à 12:12:28

        bonjour

        pour tester une ligne complète, dans ton cas. On peut par exemple faire la somme:

        if sum(ligne):

        éventuellement any(), plus rapide ? 

        Dans même ordre d'idée, si on fait une nouvelle matrice purgée

        [l for l in bad_matrice if sum(l)]

        ps: il me semble que del() dans une liste n'est pas performant, donc il faut tester si créer une nouvelle n'est pas plus rapide...


        -
        Edité par papajoker 8 juin 2024 à 12:27:15

        • Partager sur Facebook
        • Partager sur Twitter
          8 juin 2024 à 18:40:38

          J'ai bien dit que je ne donnais pas de truc avancé. C'est assez simple quand il s'agit de lignes, mais c'est moins évident quand il s'agit de colonnes.

          Est-ce que JouryMsaken connait les compréhensions ou le slicing?

          Quoi faire quand plus d'une colonne est nulle?

          Petit essai:
          L = [l for l in range(nl) if all(M[l][c]==0 for c in range(nc))]
          C = [c for c in range(nc) if all(M[l][c]==0 for l in range(nl))]
          M = [[M[l][c] for c in range(nc) if c not in C] for l in range(nl) if l not in L]

          -
          Edité par PierrotLeFou 8 juin 2024 à 19:22:12

          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            8 juin 2024 à 21:18:44

            On zip, on filtre, et on rezip.

            m = [[1,2,0,3],[4,5,0,6],[7,8,0,9]]
            
            m = [l for l in zip(*m) if any(l)]
            m = [*map(list,zip(*m))]
            
            print(m)
            
            [[1, 2, 3], [4, 5, 6], [7, 8, 9]]




            -
            Edité par josmiley 8 juin 2024 à 21:29:42

            • Partager sur Facebook
            • Partager sur Twitter

            Python c'est bon, mangez-en. 

              8 juin 2024 à 23:34:14

              Est-ce que JouryMsaken connait les compréhensions ou le slicing?

              oui je connais les deux mais comme tu l'as bien dit, "je ne suis pas un as". Ce que m'a gêné c'est de tester un ensemble et pas un élément.

              L'idée de la "somme" (à laquelle je n'ai pas pensé) et "all" ( que je ne maitrise pas découvert pas longtemps) me paraient facile à appliquer et efficace. le reste (zip, map, any,...) il faut que je teste et que je lis la doc

              Merci à vous tous.

              • Partager sur Facebook
              • Partager sur Twitter
                12 juin 2024 à 1:22:05

                En une ligne?

                -

                M = [[1, 2, 0, 3], [0, 0, 0, 0], [4, 5, 0, 6],[7, 8, 0, 9]]
                M = [list(L) for L in zip(*[C for C in zip(*M) if any(C)]) if any(L)]
                print(M)

                -

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

                -
                Edité par PierrotLeFou 12 juin 2024 à 1:32:43

                • Partager sur Facebook
                • Partager sur Twitter

                Le Tout est souvent plus grand que la somme de ses parties.

                Comment supprimer ligne(s) ou colonne(s) matrice

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                • Editeur
                • Markdown