簡體   English   中英

為什么 xarray 在加載時將隨機數引入 NetCDF4 文件中的變量?

[英]Why is xarray introducing random numbers to a variable inside a NetCDF4 file when loading?

問題:

我創建了一個 NetCDF4 文件,當使用 xarray 打開該文件時,會將高值引入感興趣的變量,並且 kernel 不斷崩潰。 加載到 MATLAB 時我沒有看到高值,這表明它可能是 NetCDF4 文件和 xarray 之間的不兼容問題?

這就是我所做的:

我首先創建一個包含我感興趣的變量的 NetCDF4 文件:

from netCDF4 import Dataset
import numpy as np
import xarray as xr
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Create data
data_2_save = np.squeeze(np.float32(np.zeros([6,29947])))
data_2_save[0,1000:27300] = np.nan; 
data_2_save[1,1010:27310] = np.nan; 
data_2_save[2,1050:27350] = np.nan; 
data_2_save[3,1000:27300] = np.nan; 
data_2_save[4,900:27300] = np.nan; 
data_2_save[5,100:27300] = np.nan; 
# time range
t = np.float32(range(-2921,27026,1))
# for other dimension
d = np.arange(1,7)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# create NetCDF4 file
filename = 'test.nc'
dataset = Dataset(filename, 'w',  format='NETCDF4_CLASSIC') 
fillvalue = 999999
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# define dimensions
TIME_DIM = dataset.createDimension('TIME', None)
D_DIM = dataset.createDimension('D', np.size(d))
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# create variables
TIME = dataset.createVariable('TIME', np.float32, ('TIME',)) 
D = dataset.createVariable('D', np.int32, ('D',))
VAR = dataset.createVariable('VARIABLE', np.float32, ('TIME','D'), 
                              fill_value=fillvalue)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# VAR
VAR.long_name = 'name'
VAR.valid_max = np.float32(np.nanmax(data_2_save))
VAR.valid_min = np.float32(np.nanmin(data_2_save))
VAR.coordinates = 'TIME D'
VAR.comment = ('A comment goes here')
# Time
time_unit_out= "days since 1950-01-01 00:00:00 UTC"
TIME.units = time_unit_out
TIME.long_name = 'analysis time'
TIME.standard_name = 'time'
TIME.valid_max = np.nanmax(t)
TIME.valid_min = np.nanmin(t)
TIME.axis = 'T'
TIME.calendar = 'gregorian'
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# D
D.standard_name = 'D'
D.valid_max = np.int32(np.round(np.nanmax(d)))
D.valid_min = np.int32(np.round(np.nanmin(d)))
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Save data into NetCDF
TIME[:] = t
D[:] = np.ndarray.tolist(d)
VAR[:] =np.transpose(data_2_save)
dataset.close()# and the file is written

然后我稍后加載文件和 plot 如下:

import xarray as xr
data = xr.open_dataset('test.nc')
data.VARIABLE[:,1].plot()

然后要么 kernel 崩潰,要么產生 plot。 每次都會產生不同的 plot,隨機數與我期望的(0.,nan)一起繪制。 這些隨機數可以是 = ~20000,> e+38,有時 = 0。這些隨機數往往位於變量數組的末尾,應該是 NaN。 有時沒有引入隨機數。

我嘗試了以下方法:

  • '康達更新--全部'
  • 在 NetCDF4 文件中創建變量時嘗試使用“np.int32”、“np.float64”、“float”
  • 創建 NetCDF4 文件時將格式從“NETCDF-CLASSIC”更改為“NETCDF4”

版本

  • Python 3.9
  • xarray 0.20.1
  • matplotlib 3.5.1
  • netcdf4 1.5.7
  • numpy 1.21.5

由於使用 pip 和 conda 安裝軟件包時出現問題,我最近重新安裝了 Anaconda 和軟件包。

我已經嘗試使用 Spyder 和 Jupyter Notebook 進行此操作,並且在同時使用兩者時會發生這種情況。

我決定使用 xarray 而不是 netCDF4 package 來制作 NetCDF 文件。 問題不再發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM