我有20个来自WRF模型的netCDF文件(不同的运行),我想从所有这些文件中获取 slp 变量,并只放入一个 xarray.DataArray 。
读取第一个文件后,我使用 expand_dims 添加了新尺寸。因此,在那之后,我尝试分配从其他文件获得的值。但是,出现以下错误:
ValueError:分配目标是只读的
下面是代码:
arq = nc.Dataset( dataDir+lista[0] )
dados = wrf.getvar( arq, 'slp', wrf.ALL_TIMES )
arq.close()
pnmm = dados.expand_dims( dim={ 'membro':Narqs } )
for membro in np.arange(1,20):
arq = nc.Dataset( dataDir+lista[ membro ] )
dummy = wrf.getvar( arq, 'slp', wrf.ALL_TIMES )
pnmm[ membro, :, :, :] = dummy
del dummy
arq.close()
此处, Narqs 是一个整数变量,具有从列表 lista 获取的netCDF文件数,该列表是通过 os.listdir()获得的
expand_dims 之后,我得到了理想的数组形状,并为所有文件中的所有数据添加了额外的尺寸。但是,这行
pnmm [membro,:,:,:] =虚拟
产生错误。我试图只分配 dummy 的值(带有 dummy.values ),但是由于 pnmm 是只读的,所以没有用。 / p>
所以
1)为什么 pnmm DataArray是只读的?它是真的只读还是我以错误的方式访问了它的元素?
2)有没有一种方法可以轻松地将值分配给 pnmm DataArray?
我曾尝试使用 xarray.concat ,它可以工作,但是我真的很想了解为什么上述方法不起作用,因为它看起来更加直观。另外,使用 concat ,我必须创建和删除更多的 dummy 变量以使其起作用。
更新:
如上所述,使用 xarray.concat 解决了我的问题,并在下面显示了代码:
for membro in np.arange(0,20):
if membro == 0:
print( 'acessando arquivo 0' )
arq = nc.Dataset( dataDir+lista[ membro ] )
pnmm = wrf.getvar( arq, 'slp', wrf.ALL_TIMES )
arq.close()
else:
print( 'acessando arquivo '+str( membro ) )
arq = nc.Dataset( dataDir+lista[ membro ] )
d2 = wrf.getvar( arq, 'slp', wrf.ALL_TIMES )
arq.close()
d3 = xr.concat( [pnmm,d2], dim='membro' )
del pnmm, d2
pnmm = d3.copy()
del d3
但是,即使解决了这个问题,我仍然很想知道如何以一种更简单的方式进行操作,例如使用 pnmm [membro,:,:,:] =虚拟。我还尝试了其他方法,例如:
dados = wrf.getvar( arq, 'slp', wrf.ALL_TIMES )
pnmm = dados.copy( deep=True, data=None )
pnmm = dados.expand_dims( dim={ 'membro':Narqs } )
但是,只读问题仍然存在。
换句话说:我只想从netCDF文件中获取DataArray的结构,为该结构添加一个新维度,然后为该新对象分配值。
谢谢。
伴侣
答案 0 :(得分:2)
1)为什么pnmm DataArray是只读的?它是真的只读还是我以错误的方式访问了它的元素?
仅在此阶段准备就绪,因为它直接指向磁盘上的netCDF文件。
2)有没有一种方法可以轻松地将值分配给pnmm DataArray?
我的建议是使用一种以xarray为中心的方法,避免使用低级的netCDF4库。您可以使用xarray.open_mfdataset在一行中准确地完成所需的操作。像这样:
ds = xr.open_mfdataset('/path/to/files/*.nc', concat_dim='member')
如果失败,则可能需要添加预处理功能或单独打开文件,然后在结果数据集上手动调用xarray.concat。