2017-11-07 19 views
1

to_netcdfで保存したいxarrayデータセットに複雑なデータ(numpy dtype complex128)があります。私は次のエラーを取得する:complex128データを含むxarray.DataArrayを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 

私はサポートされていない基礎となるnetCDF4にデータ型を渡していますことを理解します。また、netcdf4の複合データ型でhttps://unidata.github.io/netcdf4-python/が見つかりました。しかし、残念ながら私はnetcdf4ライブラリを直接使っていないので、私は自分の問題にどのように適用できるのか分かりません。

データ型complex128のデータをnetcdfにデータ型を保存して(xarray.DataArray.to_netcdfを使用して)保存できますか?

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') 

答えて

0

のNetCDFファイル形式としては、複雑なデータをサポートしていません。明らかに、地球科学ユーザーは複雑な価値を保存する必要性がありませんでした。

つまり、カスタムコンパウンドデータタイプなどのような特別な規則を使用して、実際にcomplex128データをnetCDFファイルに書き込むことができます。これは、h5pyで使用されているアプローチに似ています。これは本当にxarray自体で実装する必要があります。プルリクエストは歓迎されます。

  1. 使用engine='h5netcdf':xarrayの現在のバージョンで

    は、複雑な値をシリアル化するための2つのオプションがあります。これはh5pyの規則を使用して複雑なデータを書き出します。残念ながら、無効なnetCDFファイルはunreadable by netCDF-Cになります。 試してみると、これを示す警告メッセージが表示されます。 xarrayの将来のバージョンでは、このような無効なファイルを作成するためにto_netcdf()ではなく、to_hdf5()などの専用の方法を使用する必要があります。

  2. データを実数部と虚数部に変換し、別々の変数として保存します。ディスクからデータを読み戻すときにそれらを結合して複雑な値に戻します。アドホック・コンベンションがあなたに一番いいと思われるものを選んでください。

例えば、

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 
関連する問題