Ann*_*use 5 python python-xarray netcdf4
我在 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
Run Code Online (Sandbox Code Playgroud)
我确实知道我正在将数据类型传递给不受支持的底层 netCDF4。我还发现https://unidata.github.io/netcdf4-python/有关 netcdf4 的复合数据类型。但不幸的是,我不知道如何将其应用于我的问题,因为我没有直接使用 netcdf4 库。
我可以将数据类型complex128的数据保存到netcdf,同时保留数据类型(使用xarray.DataArray.to_netcdf)吗?
微量元素:
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')
Run Code Online (Sandbox Code Playgroud)
NetCDF 作为一种文件格式不支持复杂数据。显然,地球科学用户对保存复杂值没有强烈的需求。
也就是说,您确实可以使用某种临时约定(例如使用自定义复合数据类型)将复杂的 128 数据写入 netCDF 文件。这与 h5py 使用的方法类似。这确实需要在 xarray 本身中实现:欢迎拉取请求。
使用当前版本的 xarray,您有两种序列化复数值的选项:
使用engine='h5netcdf'。这使用 h5py 的约定来写入复杂的数据。不幸的是,这会导致 netCDF 文件无效,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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2867 次 |
| 最近记录: |