IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Générer une matrice avec nombre aléatoires


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    BTS
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BTS
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Par défaut Générer une matrice avec nombre aléatoires
    Bonjour tout le monde,

    j'ai un petit soucis qui m'empêche de dormir car je ne trouve pas de solution ni de piste en cherchant sur le net, j'expose mon problème :
    -je veux créer une fonction qui me génère une matrice avec des nombres aléatoires en utilisant seulement les fonctions de base de Python (sauf pour le random), exemple :
    je fais appel a ma fonction GenMatrice(3,4,-10,10)
    j'attend qu'elle me génère une matrice de 3 par 4 avec des nombre compris entre -10 et 10 :
    [2 , -5 , 1 ]
    [6 , -9 , 3 ]
    [-7 , 4 , 10 ]

    Voila ce que j'ai déjà fait mais qui ne fonctionne pas très bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def CreationMatrice (nbx,nby,min,max) :
        import random
        # j'initialise mon tableau de nbx par nby le tout a 0
        tableau = [([0]*nby)]*nbx
        y=0
        x=0
        for x in range (nbx):
            for y in range (nby) :
                tableau[x][y] = random.randint(min,max)
        return (tableau)
    Quand je le teste avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A = CreationMatrice(3,3,-10,10)
    print (A)
    Cela me donne bien ma matrice de 3 par 3 mais chaque ligne est identique :
    [ -8 , 5 , 6 ]
    [ -8 , 5 , 6 ]
    [ -8 , 5 , 6 ]

    Et si je change en mettant 3 par 4 j'ai un tableau de 4 par 3 et non 3 par 4 !

    S'il-vous plais aidez moi je n'en dors plus

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Le principe simple est de créer une fonction permettant de générer une liste de n colonnes de nombres aléatoires.

    Pour n lignes, faire n fois la fonction ci-dessus.

    Du coup ça peut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    from random import randint
     
    def generer(n_column, mini, maxi):
        """génère une seule ligne de n colonnes""" 
        return [randint(mini, maxi) for i in range(n_column)]
     
    def creer_matrix(n_line, n_column, mini, maxi):
        """crée la matrice en fonction du nombre de lignes"""
        matrix = []
        for i in range(n_line):
            matrix.append(generer(n_column, mini, maxi))
        return matrix
     
    for line in creer_matrix(3, 4, -10, 10):
        print(line)

  3. #3
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Grand classique de cette syntaxe de multiplication*!

    [0]*3 crée effectivement une liste de trois éléments, en copiant dedans 0. Coup de bol, 0 est un élément “basique” qui est copié par valeur (simplification quelque peu grossière, mais bon…), autrement dit, si tu changes le premier élément de ta liste, les deux autres ne sont pas affectés.

    Mais avec [[0]*3]*4, la “multiplication extérieure” copie une liste, et là, ça se fait par référence, autrement dit tu te retrouves avec quatre fois la même liste… Forcément, quand tu modifies l’élément 1 de la quatrième liste, tu modifies aussi celui des trois autres*!

    C’est facile à vérifier*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> lst = [[0]*3]*4
    >>> for l in lst:
    ...     print(id(l))
    ... 
    139844969510744
    139844969510744
    139844969510744
    139844969510744
    CQFD…

    Maintenant, moi, je ferais directement ça avec une bonne vielle list comprehension*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def CreationMatrice (nbx,nby,min,max) :
        import random
        return [[random.randint(min, max) for i in range(nby)] for j in range(nbx)]
    nby correspond au nombre de colonnes, et nbx, au nombre de lignes, si tu prends la convention “row major” (la plus intuitive pour afficher ça facilement en py), et l’inverse si tu choisis plutôt “column major”…

  4. #4
    Futur Membre du Club
    Homme Profil pro
    BTS
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BTS
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Par défaut
    Alors là merci ! Juste que du coup j'ai envie de tuer tout le monde mais merci
    Dernière question mais je ne souhaite pas la fonction toute cuite dans mon bec . Est-il possible de crée une autre fonction ayant un tableau en entrée et qui affiche chaques ligne l'une en dessous de l'autre. Juste histoire de rendre ma matrice plus lisible à la fin.

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Est-il possible de crée une autre fonction ayant un tableau en entrée et qui affiche chaques ligne l'une en dessous de l'autre. Juste histoire de rendre ma matrice plus lisible à la fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def afficher(mat):
        for line in mat:
             print(line)
    où mat est la liste des lignes, si tu suis mon exemple.

    D'ailleurs c'est ce que fait ma ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for line in creer_matrix(3, 4, -10, 10):
        print(line)

  6. #6
    Futur Membre du Club
    Homme Profil pro
    BTS
    Inscrit en
    Mai 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BTS
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 3
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def afficher(mat):
        for line in mat:
             print(line)
    où mat est la liste des lignes, si tu suis mon exemple.

    D'ailleurs c'est ce que fait ma ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for line in creer_matrix(3, 4, -10, 10):
        print(line)
    Ok c'est ce que je viens de faire donc sa me conforte. Je vous remercie beaucoup de votre aide extrêmement rapide et claire !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Générer une table de nombres aléatoires
    Par kikou0704 dans le forum MATLAB
    Réponses: 3
    Dernier message: 12/07/2013, 22h59
  2. [TPW] Remplissage aléatoire d'une matrice avec une condition
    Par abdou monta dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 24/11/2012, 16h54
  3. générer une matrice aléatoire
    Par harris_macken dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 17/03/2008, 19h23
  4. Réponses: 2
    Dernier message: 27/05/2007, 22h23
  5. Réponses: 8
    Dernier message: 02/12/2005, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo