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.

War es hilfreich?

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=' ')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top