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 :

Modifier un numpy array dans une fonction ?


Sujet :

Python

  1. #1
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut Modifier un numpy array dans une fonction ?
    Bonjour.

    Je viens du monde du C++ et j'ai vraiment du mal à comprendre comment python gère les références.

    Ca doit faire environ 3h que j'essaye de modifier des numpy array dans une fonction sans y parvenir .

    Voilà mon code :
    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
    16
    17
    18
    def do_something(filename = "", column1 = np.zeros(0), column2 = np.zeros(0), column3 = np.zeros(0)):
        data1, data2, data3 = np.loadtxt(filename, unpack=True)
        # Do something on data1, data2, data3 #
        column1 = data1
        column2 = data2
        column3 = data3
        print column1 # OK
        print column2 # OK
        print column3 # OK
        return
     
    column1 = np.zeros(0)
    column2 = np.zeros(0)
    column3 = np.zeros(0)
    do_something(myfile, column1, column2, column3)
    print column1 # EMPTY
    print column2 # EMPTY
    print column3 # EMPTY
    Quelqu'un pourrait-il m'expliquer comment ajouter data1, data2, data3 aux column1, column2, column3 et arriver à les resortir de la fonction...

    Merci beaucoup.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,
    Modifier un objet passe par lui appliquer une méthode.
    En écrivant "column1 = data1" vous ne modifiez pas "column1" mais vous assignez un autre objet à "column1". Comme cet objet n'est pas retourné, l'appelant verra les mêmes objets qu'avant l'appel à la fonction.

    Je n'ai pas trouvé de méthode qui permette de faire un .append à un array numpy: "vstack" et "append" sont des fonctions qui prennent l'ancien array en paramètre et qui retournent à priori un nouveau array.

    Le plus simple dans ce cas est d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def do_something(filename = ""):
        return np.loadtxt(filename, unpack=True)
    column1, column2, column3 = do_something(myfile)
    print column1
    print column2 
    print column3
    Note: Rien n'interdit d'ajouter ce qui est lu à des column1,2,3 passés en paramètre mais il faudra les remonter explicitement.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur R&D en apprentissage statistique
    Inscrit en
    Juin 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur R&D en apprentissage statistique

    Informations forums :
    Inscription : Juin 2009
    Messages : 447
    Points : 752
    Points
    752
    Par défaut
    Avec une approche similaire à la tienne ça donnerait:

    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
    def do_something(filename = "", column1, column2, column3):
        data1, data2, data3 = np.loadtxt(filename, unpack=True)
        # Do something on data1, data2, data3 #
        column1.resize(data1.shape)
        column1[:] = data1 # affectation au contenu de column1
        column2.resize(data2.shape)
        column2[:] = data2
        column3.resize(data3.shape)
        column3[:] = data3
        # return n'est pas nécessaire 
     
    column1 = np.zeros(0)
    column2 = np.zeros(0)
    column3 = np.zeros(0)
    do_something(myfile, column1, column2, column3)
    mais une approche plus Pythonique serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def do_something(filename = ""):
        data1, data2, data3 = np.loadtxt(filename, unpack=True)
        # Do something on data1, data2, data3 #
        return data1, data2, data3
     
    column1, column2, column3 = do_something(myfile)

Discussions similaires

  1. Explode/Array dans une fonction
    Par Stalk3R dans le forum Langage
    Réponses: 8
    Dernier message: 16/07/2012, 09h13
  2. [XL-2010] Comment prendre en compte un tableau (Array) dans une fonction vba?
    Par statista dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/04/2011, 15h16
  3. Array dans une fonction Mysql
    Par yanis97 dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 28/01/2010, 15h53
  4. Modifier un paramètre muable dans une fonction
    Par LDPDC dans le forum Général Java
    Réponses: 1
    Dernier message: 13/11/2009, 20h35
  5. mise à jour d'array dans une fonction
    Par Kassar dans le forum Langage
    Réponses: 3
    Dernier message: 09/11/2008, 16h32

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