将新数据分配给现有的xarray.dataarray



我有来自WRF模型的20个NetCDF文件(不同的运行(,我想从所有这些文件中获取 slp 变量,只放入一个 Xarray.DataArray 。

读取第一个文件后,我使用 explent_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 是一个整数变量,其netcdf文件的数量是从list lista 获得的,它是用 os.listdir((获得的。

Expand_Dims 我得到了所需的数组形状,并为所有文件中的所有数据提供额外的维度。但是,线

pnmm [membro,:, :,:] =虚拟

正在产生错误。我尝试仅分配 pummy (带有 dummy.values (的值,但由于 pnmm 的读数不起作用。/p>

so,

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文件中获取数据阵列的结构,向此结构添加一个新维度并将值分配给此新对象。

谢谢。

mateus

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。

最新更新