python est étrange...

21 views
Skip to first unread message

Emmanuelle Renauld

unread,
Dec 3, 2012, 2:00:37 PM12/3/12
to ift-72...@googlegroups.com
Bonjour,
 
j'ai une question par rapport au fonctionnement de python. À un moment dans mon code, j'écris: D1 = D1 + 1, où D1 est une matrice. Je veux vraiment faire une addition element-wise, et non agrandir ma matrice. Un jour, pour rendre mon code plus beau, j'ai pensé écrire D1 += 1. Et alors plus rien ne fonctionnait. J'ai voulu chercher pourquoi sur google, mais je ne suis pas sûre de comprendre la réponse. Le forum suivant semble assez bon: http://stackoverflow.com/questions/2347265/what-does-plus-equals-do-in-python. Mais dans leur cas, ils veulent vraiment augmenter la liste. Moi, non, alors je ne comprends pas pourquoi mon code bogue.
 
Un indice, peut-être. D1 est copié dans autre matrice, D2. Pourtant, j'ai bien fait attention de faire D2 = D1.copy(). Voici mon code, de façon plus complète:
 
D2 = D1.copy()
D1 = D1 + 1
while(D n'a pas convergé, donc tant que la différence entre D1 et D2 est grande):
     D1 = D2.copy()
     D2 = ...
fin du while
 
Donc mon +1 ne servait qu'à rendre D1 différent de D2 pour pouvoir entrer dans la boucle la première fois. Ce n'est probablement pas la plus belle technique, mais maintenant ça m'a rendu curieuse, pour le +=.
--------------------------------------------------------
Hi,
 
I have a question concerning python. In my code, somewhere, I write  D1 = D1 + 1, where D1 is a matrix. I do really want to add 1 element-wise, not to add it add the end. Then, I thought I could have a code more beautiful if I wrote D1 += 1 instead. But then nothing would work anymore. I looked for the reason on google, but I'm not so sure I understand the answer. This forum seems pretty good: http://stackoverflow.com/questions/2347265/what-does-plus-equals-do-in-python. But they want to add their item at the end of the list, which is not exactly my problem. So I still don't understand what's the bug in my code.
 
Maybe I have a clue, though. D1 is copied in another matrix, D2. But I thought I had done it wright; I really wrote D2 = D1.copy(). I copy here my code, maybe it's easyer to see.
D2 = D1.copy()
D1 = D1 + 1
while(D hasn't converged, so while the difference between D1 and D2 is big):
D1 = D2.copy()
D2 = ...
end of while
So the reason for my +1 was to be sure D1 would be different of D2 the first time, to enter the while loop. It might not be the best way, but now it made me curious about the +=.
 
Thank you!
 
 
Emmanuelle

Marc

unread,
Dec 3, 2012, 3:26:15 PM12/3/12
to ift-72...@googlegroups.com
Ton D1 est vraiment un np.array? Parce que moi ça ajoute bien 1 element-wise.

Si par contre type(D1) est une list, alors += est un raccourci pour appeler myList.extend([1])
--
Marc

Emmanuelle Renauld

unread,
Dec 3, 2012, 3:44:19 PM12/3/12
to ift-72...@googlegroups.com
Pourtant, oui... Je l'ai créé avec la fonction rand (rng.rand()). J'ai vérifié, ça donne bien un numpy array.
 
Mais moi aussi, j'avais fait des tests, et je n'avais pas trouvé de bug. Pourtant, les résultats de mon programme changent bel et bien alors que je ne change que cette ligne. 

Hugo Larochelle

unread,
Dec 4, 2012, 2:37:46 PM12/4/12
to ift-72...@googlegroups.com
Je ne suis pas sûr de bien suivre. Peux-tu commencé par nous dire ce que donne:

print type(D1)

Ça va déjà clarifier si D1 est bel et bien un numpy array.

Hugo

2012/12/3 Emmanuelle Renauld <emmanuelle...@gmail.com>
Pourtant, oui... Je l'ai créé avec la fonction rand (rng.rand()). J'ai vérifié, ça donne bien un numpy array.
 
Mais moi aussi, j'avais fait des tests, et je n'avais pas trouvé de bug. Pourtant, les résultats de mon programme changent bel et bien alors que je ne change que cette ligne. 

--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes IFT 725 A2012.
Pour envoyer un message à ce groupe, adressez un e-mail à ift-72...@googlegroups.com.
Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse ift-725-a201...@googlegroups.com.
Cette discussion peut être lue sur le Web à l'adresse https://groups.google.com/d/msg/ift-725-a2012/-/12mGVD8LUfsJ.

Pour plus d'options, visitez le site https://groups.google.com/groups/opt_out .
 
 

Emmanuelle Renauld

unread,
Dec 4, 2012, 4:50:31 PM12/4/12
to ift-72...@googlegroups.com
Bonjour,
 
en fait j'ai compris.
 
Le += dont je parle est dans une fonction. J'avais donc:
            D = ..
            self.Fonction(D)
 
Et dans Fonction, je faisais D+=1. Or puisque, dans python, les éléments sont passés par référence, en faisant D+=1, je changeais aussi le D dans la fonction initiale. Cela n'arrivait pas avec D = D+1 parce que dans ce cas, python fait une copie de D+1 et l'envoie dans D, et ce, que D soit une liste ou un numpy array.
 
Merci
 
Emmanuelle
Reply all
Reply to author
Forward
0 new messages