Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > fr.comp.lang.python > #3055
| From | Alain Ketterlin <alain@universite-de-strasbourg.fr.invalid> |
|---|---|
| Newsgroups | fr.comp.lang.python |
| Subject | Re: problème de copie ? shallow - deep |
| Date | 2018-02-01 18:34 +0100 |
| Organization | Université de Strasbourg |
| Message-ID | <871si4zk9f.fsf@universite-de-strasbourg.fr.invalid> (permalink) |
| References | <5a732113$0$3313$426a74cc@news.free.fr> |
Fabrice <professeur.leclercq@gmail.com> writes:
> je n'ai toujours pas compris on dirait ;-)
> Voici le code qui marche et qui simule le reflet d'une image dans l'eau:
>
> import matplotlib.pyplot as mpl # mpl sera notre repère
> import numpy as np # np manipule des tableaux
> import copy
>
> originale = mpl.imread("damier.jpeg") # un image est lue
> image = copy.copy(originale) # image est une copie modifiable
> hauteur = len(image) # hauteur contient le nombre de ligne
> largeur = len(image[0]) # largeur contient le nombre de pixel
>
> for ligne in range(hauteur//2):
> tmp = copy.copy(image[ligne])
> image[ligne] = image[hauteur-ligne-1]
> image[hauteur-ligne-1] = tmp
>
> print("L'originale")
> mpl.imshow(originale,cmap='gray') # On affiche l'image dans le repère
> mpl.show() # On affiche le repère à l'écran
> print("et son reflet dans l'eau")
> mpl.imshow(image,cmap='gray') # On affiche l'image dans le repère
> mpl.show()
>
>
> mais si je ne fais pas copy.copy, je perds la liste dans tmp.
En fait, il ne faut pas considérer les np.array (ou image) comme des
listes Python. Ce sont des structures différents, même si la syntaxe est
similaire.
Si j'ai bien compris (mais marc.marc pourra confirmer -- ou pas), quand
tu écris :
tmp = image[ligne]
tu récupères une "view" sur l'image originale. Ce n'est pas une simple
référence, et de toute façon image[ligne] n'existe pas indépendamment du
reste l'image (les np.array sont "denses", alors que les listes de
listes sont "creuses", ou éclatées).
Donc : 1) les lignes n'existent pas individuellement, 2) tmp et
image[ligne] sont effectivement la même chose, et donc 3)
image[ligne]=... modifie effectivement aussi bien l'image que tmp.
(Je m'arrête là, parce que je ne peux pas essayer en ce moment...)
> Pourtant, tmp et image[ligne] sont des étiquettes qui pointent sur la
> même liste.
> Quand je fais image[ligne] = image[hauteur-ligne-1], je détache
> l'étiquette image[ligne] de la liste dans tmp pour la coller sur la
> liste image[hauteur-ligne-1]. l'étiquette tmp devrait pointer sur la
> liste en mémoire qui ne doit ^pas être effacée puisque référencée.
> Puis je détache l'étiquette image[hauteur-ligne-1] de la liste dans
> image[ligne] maintenant pour l'attacher à la liste dans tmp.
>
> En C++, j'aurai dit que j'ai échangé les pointeurs. Un objet mutable,
> c'est bien un pointeur ?
Ton analyse s'applique bien aux listes python d'origine.
Mais numpy c'est une tout autre bestiole... C'est fait pour faire du
calcul scientifique, donc dans des matrices denses, comme on fait dans
les langages raisonnablement efficaces pour ça (Fortran, C and co).
Numpy, c'est le renard (C/Fortran/...) qui entre dans le poulailler
(celui qui est plein de canards).
-- Alain.
Back to fr.comp.lang.python | Previous | Next — Previous in thread | Next in thread | Find similar
problème de copie ? shallow - deep Fabrice <professeur.leclercq@gmail.com> - 2018-02-01 15:15 +0100
Re: problème de copie ? shallow - deep Alain Ketterlin <alain@universite-de-strasbourg.fr.invalid> - 2018-02-01 18:34 +0100
Re: problème de copie ? shallow - deep marc.marc@marc.org - 2018-02-01 21:19 +0100
Re: problème de copie ? shallow - deep Fabrice <professeur.leclercq@gmail.com> - 2018-02-02 18:09 +0100
Re: problème de copie ? shallow - deep Nicolas <nicolasp@aaton.com> - 2018-02-05 09:43 +0100
Re: problème de copie ? shallow - deep marc.marc@marc.org - 2018-02-05 15:02 +0100
csiph-web