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

时间:2019-08-02 20:24:42

标签: python variable-assignment python-xarray

我有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的结构,为该结构添加一个新维度,然后为该新对象分配值。

谢谢。

伴侣

1 个答案:

答案 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。