netCDF4设置fill_value后读取结果与预期不符问题咨询
问题原因及修正方案
核心错误原因
- 两个变量共用了同一个无限维度
0:当你给形状为(2,3)的variable2赋值时,共享的0维度会被自动拉长到长度2,导致形状为(1,3)的variable1被动多出1行未初始化的存储空间,这部分空间不会自动填充你设置的fill_value,只会保留原始内存值,对应的mask也不会自动生成。 - 写入完成后未关闭
Dataset对象:fill_value属于变量元数据,只有在数据集关闭时才会被正式写入文件,你在写入后直接读取内存中的变量,会出现元数据未生效的问题,表现为variable2的fill_value为默认的999999。
修正方案
场景1:两个变量不需要共享维度长度(大部分场景适用)
给两个变量创建独立的维度,避免互相影响,同时使用with上下文管理器自动处理数据集的关闭逻辑,不需要手动调用close():
import numpy as np from netCDF4 import Dataset array1 = np.array([[1,2,3]]) array2 = np.array([[4,5,6],[7,8,9]]) # 写入文件 with Dataset("D:/test.nc", "w", format="NETCDF4") as rootgrp: # variable1的独立维度 rootgrp.createDimension("var1_dim0", None) rootgrp.createDimension("var1_dim1", 3) # variable2的独立维度 rootgrp.createDimension("var2_dim0", None) rootgrp.createDimension("var2_dim1", 3) variable1 = rootgrp.createVariable("variable1", array1.dtype.str, ("var1_dim0", "var1_dim1"), fill_value=-1) variable2 = rootgrp.createVariable("variable2", array2.dtype.str, ("var2_dim0", "var2_dim1"), fill_value=-1) variable1[:] = array1 variable2[:] = array2 # 读取文件 with Dataset("D:/test.nc", "r") as rootgrp: result1 = rootgrp['variable1'][:] result2 = rootgrp['variable2'][:]
场景2:确实需要两个变量共享同一个无限维度
先确定共享维度的最大长度,显式控制写入范围,同时主动给variable1未赋值的区域填充fill_value:
import numpy as np from netCDF4 import Dataset array1 = np.array([[1,2,3]]) array2 = np.array([[4,5,6],[7,8,9]]) max_dim0_len = max(array1.shape[0], array2.shape[0]) with Dataset("D:/test.nc", "w", format="NETCDF4") as rootgrp: rootgrp.createDimension("dim0", None) rootgrp.createDimension("dim1", 3) variable1 = rootgrp.createVariable("variable1", array1.dtype.str, ("dim0", "dim1"), fill_value=-1) variable2 = rootgrp.createVariable("variable2", array2.dtype.str, ("dim0", "dim1"), fill_value=-1) # 显式指定写入切片,避免维度意外拉长 variable1[:array1.shape[0], :] = array1 variable2[:array2.shape[0], :] = array2 # 主动填充variable1未赋值的区域 variable1[array1.shape[0]:, :] = variable1._FillValue with Dataset("D:/test.nc", "r") as rootgrp: result1 = rootgrp['variable1'][:] result2 = rootgrp['variable2'][:]
两种方案执行后,得到的result1、result2都会和你的预期一致。
内容的提问来源于stack exchange,提问作者Giovanni Formighieri
相关产品推荐
相关产品推荐

