2017-11-07 10 views
1

Ich habe einige komplexe Daten (numpy dtype complex128) in einem Xarray-Datensatz, den ich mit to_netcdf speichern möchte. Ich erhalte die folgende Fehlermeldung:So speichern Sie xarray.DataArray mit complex128 Daten zu netcdf

TypeError: illegal primitive data type, must be one of dict_keys(['S1', 'i1', 'u1', 'i2', 'u2', 'i4', 'u4', 'i8', 'u8', 'f4', 'f8']), got complex128 

Ich verstehe, dass ich einen Datentyp auf den darunter liegenden netCDF4 am Übergang, die nicht unterstützt wird. Ich fand auch https://unidata.github.io/netcdf4-python/ auf zusammengesetzte Datentypen mit netcdf4. Aber leider sehe ich nicht, wie ich das auf mein Problem anwenden kann, da ich nicht direkt mit der netcdf4-Bibliothek arbeite.

Kann ich Daten des Datentyps complex128 unter Beibehaltung des Datentyps (unter Verwendung von xarray.DataArray.to_netcdf) in netcdf speichern?

MWE:

import numpy as np 
import xarray as xr 
complex = [np.complex(1.0, 1.0), np.complex(2.0, 1.0), np.complex(3.0, 1.0), np.complex(4.0, 1.0)] 
data = xr.DataArray(complex) 
data.to_netcdf(r'test.nc') 

Antwort

0

NetCDF als Datei-Format unterstützt keine komplexen Daten. Anscheinend haben die Geowissenschaftler keine Notwendigkeit, komplexe Werte zu speichern.

Das heißt, Sie könnten tatsächlich complex128 Daten in eine netCDF-Datei schreiben mit einer Art von Ad-hoc-Konvention, wie mit einem benutzerdefinierten Verbindung Datentyp. Dies ist ähnlich wie bei h5py. Dies müsste in der Tat in xarray selbst implementiert werden: eine Pull-Anfrage wäre willkommen.

Mit der aktuellen Version von xarray, haben Sie zwei Möglichkeiten für komplexe Werte Serialisierung:

  1. Verwendung engine='h5netcdf'. Dies verwendet die h5py-Konvention, um komplexe Daten zu schreiben. Leider führt dies zu einer ungültigen netCDF-Datei, die unreadable by netCDF-C ist. Sie sollten eine Warnmeldung sehen, die dies anzeigt, wenn Sie es versuchen. In einer zukünftigen Version von Xarray werden wir wahrscheinlich eine dedizierte Methode wie to_hdf5() anstelle von to_netcdf() für die Erstellung solcher ungültigen Dateien benötigen.

  2. Konvertieren Sie die Daten in Real- und Imaginärteile und speichern Sie sie als separate Variablen. Kombinieren Sie sie wieder in komplexe Werte, wenn Sie die Daten von der Festplatte zurücklesen. Wählen Sie die Ad-hoc-Konvention, die Ihnen am besten erscheint.

z.B.

def save_complex(data_array, *args, **kwargs): 
    ds = xarray.Dataset({'real': data_array.real, 'imag': data_array.imag}) 
    return ds.to_netcdf(*args, **kwargs) 

def read_complex(*args, **kwargs): 
    ds = xarray.open_dataset(*args, **kwargs) 
    return ds['real'] + ds['imag'] * 1j 
Verwandte Themen