2017-07-20 3 views
1

Ich versuche, alle Werte in einem Würfel mehr als eine bestimmte Anzahl auf Null zu setzen.Setzen Sie alle Werte in einem Würfel mehr als eine bestimmte Anzahl auf Null

Ich habe die folgende noddy Weise versucht:

cube_tot_lo.data = np.where(cube_tot_lo.data < 1.0e19, cube_tot_lo.data, 0.0) 

aber es ist ein großer Würfel und tötet den Speicher. Ich habe mich gefragt, ob es einen schöneren Weg gibt, das zu tun?

Vielen Dank für Ihre Zeit!

Antwort

2

(1) Ein üblichere numpy Idiom sei:

cube.data[cube.data < threshold_value] = 0.0 

Ich denke, dass einiger Eindruck auf dem Speicherproblem machen sollte, da es nicht einen ganz neuen Floating-Point-Array nicht berechnen zu zurück zuweisen.
Es muss jedoch ein boolesches Array mit Datengröße für cube.data < threshold_value erstellt werden, damit es Ihr Problem möglicherweise immer noch nicht löst.

(2) Eine wirklich einfache Leistungsverbesserung könnte das in Sektionen sein, wenn Sie eine Dimension haben, die Sie überschneiden können, wie eine typische Z-Dimension mit einigen 10er Ebenen? Dann können Sie einfach die Aufgabe teilen, zum Beispiel für einen 4d Würfel von dims t, z, y, x: -

for i in range(nz): 
    part = cube.data[:, iz] 
    part[part < threshold_value] = 0.0 

, die auch gut funktionieren soll, wenn Ihr Würfel bereits „echte“ enthält nicht " faule "Daten.

(3) jedoch Ich frage mich, ob Ihr Schlüssel Problem könnte sein, dass auf einmal alle Daten holen selbst einfach zu groß?
Das ist in Iris perfekt möglich, da es verzögertes Laden verwendet: so wird jeder Verweis auf "cube.data" alle Daten in ein echtes In-Speicher-Array abrufen, während z. Einfach das Speichern des Würfels oder das Berechnen einer Statistik könnte dies vermeiden.
So hängt die Verwendbarkeit wirklich großer Würfel kritisch davon ab, was Sie schließlich mit dem Inhalt tun.

Iris jetzt einen viel volleren diesen Umstand Rechnung hat, in der Dokumentation für die kommende Version 2.0: https://scitools-docs.github.io/iris/master/userguide/real_and_lazy_data.html

Zum Beispiel mit Dask in der kommenden Iris v2, wird es möglich sein dask zu verwenden, um dies effizient zu tun . Etwas wie:

data = cube.lazy_data() 
data = da.where(data < threshold_value, data, 0.0) 
zapped_cube = cube.copy(data=data) 

Dies macht einen abgeleiteten Würfel mit einer verzögerten Datenberechnung. Da dies in "Chunks" verarbeitet werden kann, wenn es soweit ist, kann es die Speicherauslastung drastisch reduzieren.

Verwandte Themen