Warum eine Zuordnung für Doppel geschnittenen numpy Arrays nicht?
-
18-09-2019 - |
Frage
Warum die folgenden Zeilen nicht arbeiten, wie ich erwarten?
import numpy as np
a = np.array([0,1,2,1,1])
a[a==1][1:] = 3
print a
>>> [0 1 2 1 1]
# I would expect [0 1 2 3 3]
Ist dies ein ‚Fehler‘ oder gibt es eine andere Art und Weise zu empfehlen, um das?
Auf der anderen Seite sind die folgenden Werke:
a[a==1] = 3
print a
>>> [0 3 2 3 3]
Cheers, Philipp
Lösung
Es scheint, Sie können einfach nicht einen Auftrag über eine Doppelscheibe wie das tun.
Das funktioniert aber:
a[numpy.where(a==1)[0][1:]] = 3
Andere Tipps
Es ist damit zusammen, wie Phantasie Indizierung funktioniert. Es gibt eine ausführliche Erklärung hier . Es wird auf diese Weise getan inplace Modifikation mit ausgefallener Indizierung (dh a[x>3] *= 2
) zu ermöglichen. Eine Folge davon ist, dass Sie nicht zu einem doppelten Index zuweisen können, wie Sie gefunden haben. Fancy Indizierung immer gibt eine Kopie statt einer Ansicht.
Da die a [a == 1] Teil nicht wirklich eine Scheibe ist. Es erstellt ein neues Array. Es macht Sinn, wenn man darüber nachdenkt es-- Sie nur die Elemente, aus denen dem boolean Zustand (wie eine Filteroperation) erfüllen.
Das tut, was Sie wollen
a[2:][a[2:]==1]=3