我有来自 WRF 模型的 20 个 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 是只读的。
所以,
1) 为什么pnmm DataArray 是只读的?它真的是只读的还是我以错误的方式访问其元素?
2) 有没有一种方法可以轻松地为 pnmm DataArray 赋值?
我尝试过使用 xarray.concat 并且它有效,但我真的很想了解为什么上述方法不起作用,因为它看起来更直观。另外,使用concat,我必须创建和删除更多虚拟变量才能使其正常工作。
更新:
正如我上面所写的,使用 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, :, :, :] = dummy。我还尝试过其他方法,例如:
dados = wrf.getvar( arq, 'slp', wrf.ALL_TIMES )
pnmm = dados.copy( deep=True, data=None )
pnmm = dados.expand_dims( dim={ 'membro':Narqs } )
但是,只读问题仍然出现。
换句话说:我只想从 netCDF 文件中获取 DataArray 的结构,向该结构添加新的维度并为这个新对象分配值。
谢谢。
马特乌斯
最佳答案
1) Why pnmm DataArray is read-only? Is it truly read-only or I'm accessing its elements in a wrong way?
它仅在这个阶段准备就绪,因为它直接指向磁盘上的 netCDF 文件。
2) Is there a way to easily assign values to pnmm DataArray?
我的建议是使用更以 xarray 为中心的方法,避免使用低级 netCDF4 库。您可以使用 xarray.open_mfdataset 在一行中准确地完成您想要的操作。像这样的事情:
ds = xr.open_mfdataset('/path/to/files/*.nc', concat_dim='member')
如果失败,您可能需要添加预处理函数,或单独打开文件,然后对生成的数据集手动调用 xarray.concat。
关于python - 将新数据分配给现有的 xarray.DataArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57333039/