Wie ein NumPy.recarray mit seinen beiden Ansichten ändern
-
20-08-2019 - |
Frage
Ich bin neu in Python und Numpy, und ich habe ein Problem konfrontiert, dass ich kein numpy.recarray ändern kann, wenn Aussicht auf maskierte Anwendung. Ich lese aus einer Datei recarray, erstellen Sie dann zwei maskierte Ansichten, dann versuchen, die Werte in for-Schleife zu ändern. Hier ist ein Beispiel-Code.
import numpy as np
import matplotlib.mlab as mlab
dat = mlab.csv2rec(args[0], delimiter=' ')
m_Obsr = dat.is_observed == 1
m_ZeroScale = dat[m_Obsr].scale_mean < 0.01
for d in dat[m_Obsr][m_ZeroScale]:
d.scale_mean = 1.0
Aber wenn ich das Ergebnis drucken
newFile = args[0] + ".no-zero-scale"
mlab.rec2csv(dat[m_Obsr][m_ZeroScale], newFile, delimiter=' ')
Alle scale_means in den Dateien sind immer noch Null.
Ich muss etwas falsch sein. Gibt es eine richtige Art und Weise des Wertes der Modifizierung Aussicht? Ist es, weil ich mich bewerbe zwei Ansichten eines nach dem anderen?
Danke.
Lösung
Ich denke, man eine falsche Vorstellung, in dieser Begriff „maskierte Ansichten“ und sollte (Wieder-) lesen Die Buch (jetzt frei herunterladbar) Ihr Verständnis zu klären.
Ich zitiere aus dem Abschnitt 3.4.2:
Erweiterte Auswahl wird ausgelöst, wenn das Auswahlobjekt, OBJ, ist ein Nicht-tuple Sequenzobjekt, ein ndarray (Datentyp ganze Zahl oder bool) oder ein Tupel mit mindestens einer Sequenz Objekt oder ndarray (Datentyp integer oder bool). Es gibt zwei Arten die Indexierung: integer und Boolean. Erweiterte Auswahl immer eine Kopie der Daten zurückgibt (Kontrast mit grundlegenden Slicing, dass die Renditen ein Ansicht).
Was Sie hier machen erweiterte Auswahl ist (der Booleschen Art), so dass Sie eine Kopie bekommen und nie irgendwo Bindung - Sie machen Ihre Änderungen an der Kopie und dann einfach weggehen lassen, dann schreiben Sie eine neue neue Kopie vom Original ab.
Wenn Sie verstehen, das Problem die Lösung einfach sein sollte: Ihr Exemplar einmal machen, machen Sie Ihre Änderungen an dieser Kopie, und schreiben Sie die gleiche Kopie. Das heißt:.
dat = mlab.csv2rec(args[0], delimiter=' ')
m_Obsr = dat.is_observed == 1
m_ZeroScale = dat[m_Obsr].scale_mean < 0.01
the_copy = dat[m_Obsr][m_ZeroScale]
for d in the_copy:
d.scale_mean = 1.0
newFile = args[0] + ".no-zero-scale"
mlab.rec2csv(the_copy, newFile, delimiter=' ')