2017-06-21 4 views
0

Ich versuche, Daten aus netCDF4-Dateien zu extrahieren. Diese enthalten "MaskedArrays", die Teil der Numpy-Bibliothek sind.Erhalten Sie nicht maskierte Werte in Numpys Maskierte Arrays

Meine Daten enthält: Breite, Länge, Tage und Werte (über verschiedene Dateien getrennt). Zusätzlich eine Maske, die anzeigt, welche Breiten/Längen aus verschiedenen Gründen nicht gültig sind (keine Messungen oder andere Gründe).

Meine Daten sieht wie folgt aus (für maskierte Daten):

masked_array(
    data = 
    [[[-- -- -- ..., -- -- --] 
     ..., 
     [-- -- -- ..., -- -- --]]], 
    mask = 
    [[[ True True True ..., True True True] 
     ..., 
     [ True True True ..., True True True]]], 
    fill_value = 32767) 

Ich bin für eine numpy Methode (oder ähnlich) Suche, die nur diese Werte extrahieren kann, die nicht maskiert sind. Idealerweise einfach durch Ausschneiden aller ungültigen Einträge aus dem Datensatz. Ich fand .compressed, aber es gibt ein eindimensionales Array zurück. Aus der 3. Dimension ist das ein ziemlicher Informationsverlust, da ich nicht weiß, wo diese Werte sind.

Zusätzlich versuchte ich nonzero = the_array['one of the values'][0].nonzero(). Dies gibt mir ein Doppel-Array mit lat/lon-Werten, aber danach muss ich immer noch auf diese zugreifen - was langsam ist. Leider, nachdem ich weiß, wie ich auf dieses Datum zugreifen kann, muss ich das auf 30 * 6 Dateien mit ~ 1500 × 700 × 365 Datenpunkten tun: D.

all_days = [(x, rhstmax['stuff'][x][24][1288]) for x in range(366)] 
# represents just for lat:24,lon:1288 all days. First 20: 
all_days[:20] = 
    [(0, 15.799999), 
    (1, 16.199999), 
    (2, 17.4), 
    (3, 13.2), 
    (4, 10.8), 
    (5, 11.3), 
    (6, 15.299999), 
    (7, 16.299999), 
    (8, 14.099999), 
    (9, 10.8), 
    (10, 9.5), 
    (11, 9.0999994), 
    (12, 11.9), 
    (13, 9.1999998), 
    (14, 31.0), 
    (15, 49.0), 
    (16, 8.6999998), 
    (17, 10.0), 
    (18, 44.099998), 
    (19, 30.699999)] 
# ... takes forever :(
+0

Idealerweise Was wäre die Struktur Ihrer Ausgabe nach dem Schneiden aller ungültigen Einträge? Haben Sie diese Übersicht in [Zugriff nur auf die gültigen Einträge] (https://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html#accessing-only-the-valid-entries) überprüft? –

+0

komprimiert gibt 1d zurück, weil die Zahlenwerte pro Zeile oder Spalte nicht konsistent sind. füllen ist eine weitere Möglichkeit, die maskierten Werte zu "entfernen". – hpaulj

Antwort

0

Um die nicht maskierten Daten in Python erhalten Sie das `.mask‘ Werkzeug

Sie folgende Dataset Angenommen verwenden können haben:

data = [[0,0 1,0 - - ] [2.0 3.0 - -]]

Sie können die nicht maskierten Daten erhalten, während Sie alle Indizes erhalten, die mit dem Befehl data.mask 'False' sind.

data = data [data.mask == False]

Beachten Sie, dass diese Sie 1D-Array aller Eingangs

Daten geben -> [0.0 1.0 2.0 3.0]

Verwandte Themen