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

2024-06-23 03:22:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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的结构,向这个结构添加一个新维度,并为这个新对象赋值。你知道吗

谢谢你。你知道吗

马蒂厄斯


Tags: 文件错误alldatasetdummynctimeswrf
1条回答
网友
1楼 · 发布于 2024-06-23 03:22:18

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公司在生成的数据集上。你知道吗

相关问题 更多 >

    热门问题