11
votes

Pourquoi une assignation pour les tableaux à double tranchée ne fonctionne-t-il pas?

Pourquoi les lignes suivantes ne fonctionnent pas comme je m'attends? XXX PRE>

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]


0 commentaires

4 Réponses :


4
votes

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).


6 commentaires

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 , 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)


@Dave - Certainement, une tranche de Numpy est une vue, mais un [A == 1] n'est pas une tranche et non une vue.



8
votes

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


0 commentaires

0
votes

Cela fait ce que vous voulez

a[2:][a[2:]==1]=3


1 commentaires

Mais cela nécessite de savoir à l'avance que la première occurrence de 1 est à la position 1.



10
votes

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 ). 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.


3 commentaires

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!