我有20个来自WRF model的netCDF文件(不同的运行),我想从所有这些文件中得到slp变量,并只放入一个xarray.DataArray文件。你知道吗
读取第一个文件后,我使用expand\u dims添加了一个新维度。所以,在那之后,我尝试分配从其他文件获得的值。但是,我得到了以下错误:
值错误:分配目标为只读
代码如下:
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是一个整数变量,其中包含从listlista获得的netCDF文件的数量,该文件是通过获得的操作系统列表目录()。你知道吗
在展开\u dims之后,我得到了所需的数组形状,并为所有文件中的所有数据增加了一个维度。然而,这条线
pnmm[membro,:,:,:]=假人
正在产生错误。我试图只分配dummy的值(使用虚拟值),但不起作用,因为pnmm是只读的。你知道吗
所以
1)为什么pnmmDataArray是只读的?它真的是只读的还是我用错误的方式访问了它的元素?你知道吗
2)有没有一种方法可以轻松地将值赋给pnmmDataArray?你知道吗
我试过使用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的结构,向这个结构添加一个新维度,并为这个新对象赋值。你知道吗
谢谢你。你知道吗
马蒂厄斯
它只在这个阶段准备好,因为它直接指向磁盘上的netCDF文件。你知道吗
我的建议是使用更以xarray为中心的方法,避免使用低级的netCDF4库。在一行xarray.open_mfdataset中,您可能可以完全按照自己的意愿进行操作。像这样:
如果失败,您可能需要添加预处理函数,或者单独打开文件,然后手动调用xarray.concat公司在生成的数据集上。你知道吗
相关问题 更多 >
编程相关推荐