编程语言
首页 > 编程语言> > python-如何将带有complex128数据的xarray.DataArray保存到netcdf

python-如何将带有complex128数据的xarray.DataArray保存到netcdf

作者:互联网

我在xarray数据集中有一些复杂的数据(numpy dtype complex128),我想用to_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库,因此我看不到如何将其应用于问题.

可以在保持数据类型的同时(使用xarray.DataArray.to_netcdf)将complex128数据类型的数据保存到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')

解决方法:

NetCDF作为文件格式不支持复杂数据.显然,地学用户对保存复杂值的需求并不强烈.

就是说,您确实可以使用某种特殊约定(例如使用自定义复合数据类型)将complex128数据写入netCDF文件.这类似于h5py使用的方法.这确实需要在xarray本身中实现:将欢迎请求请求.

在当前版本的xarray中,有两个用于序列化复杂值的选项:

>使用engine =’h5netcdf’.这使用h5py的约定来写入复杂数据.不幸的是,这导致一个无效的netCDF文件为unreadable by netCDF-C.
如果尝试这样做,应该会看到一条警告消息,指出这一点.在将来的xarray版本中,我们可能需要使用专用方法(例如to_hdf5()而不是to_netcdf())来创建此类无效文件.
>将数据转换为实部和虚部,并将它们另存为单独的变量.从磁盘读回数据时,将它们组合成复数值.选择最适合您的临时约定.

例如.,

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

标签:xarray,netcdf4,python
来源: https://codeday.me/bug/20191110/2015152.html