Pourquoi les lignes suivantes ne fonctionnent pas comme je m'attends? Est-ce un «bogue» ou existe une autre manière recommandée à cela? P> de l'autre Main, les travaux suivants: p> a[a==1] = 3
print a
>>> [0 3 2 3 3]
4 Réponses :
Parce que la partie A [A == 1] n'est en réalité pas une tranche. Cela crée un nouveau tableau. Il est logique que vous y réfléchissez - vous ne prenez que les éléments qui satisfont à la condition booléenne (comme une opération de filtrage). P>
J'ai ajouté un deuxième exemple qui fonctionne comme je m'attends. Je ne vois pas vraiment la différence. L'affectation ne devrait-elle pas être "canalisée"?
Je ne pense pas que cela soit tout à fait raison. Si vous faites a [A == 1] = 3 code>, cela modifie réellement le contenu de A.
@Dave - Je pense que c'est Perimosocodiae, c'est correct et que votre contre-exemple est dû à quelque chose de plus comme un piratage dans les internes numpus pour créer l'apparence d'une opération à la place.
@ Tom10 - Ce n'est pas un "hack". Cela fait partie de la mise en œuvre de la classe Array. Le comportement est documenté, par exemple, ici: SciPy.org/... . "Tranquer un tableau retourne une vue", c'est-à-dire pas une copie.
Liste normale fonctionne aussi aussi - vous pouvez attribuer des tranches (uniquement avec itérables) l = plage (10); l [5:] = plage (5) code>
@Dave - Certainement, une tranche de Numpy est une vue, mais un [A == 1] n'est pas une tranche et non une vue.
Il semble que vous ne puissiez tout simplement pas faire une mission à travers une double tranche comme celle-là.
Ceci fonctionne bien: P>
a[numpy.where(a==1)[0][1:]] = 3
Cela fait ce que vous voulez
a[2:][a[2:]==1]=3
Mais cela nécessite de savoir à l'avance que la première occurrence de 1 est à la position 1.
Il est lié à la façon dont l'indexation fantaisie fonctionne. Il y a une explication minutieuse ici . Il est fait de cette façon d'autoriser une modification accessible avec une indexation fantaisie (c'est-à-dire A [x> 3] * = 2 code>). Une conséquence de cela est que vous ne pouvez pas attribuer à un double index comme vous l'avez trouvé. L'indexation fantaisie renvoie toujours une copie plutôt qu'une vue. P>
En fait, votre solution modifie la première occurrence de 1, ce qui n'est pas ce qu'il veut.
À droite - l'a emmené avant votre commentaire. PS HI Philip C'est Robin!
Hey Robin - Quelle chance est-ce de se rencontrer ici ... Cheers de Munich!