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

标签 python variable-assignment python-xarray

我有来自 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/

相关文章:

python - Pandas - 匹配引用号以查找最早的日期

Python - 如何正确设置类的层次结构?

python - 使用 Python 修剪图像中的(噪声)空白

python - 用 pandas 数据框中的一些默认值填充每个列组合的值

ruby - 名称错误 : undefined - have parsing rules for local variables changed in Ruby 2. 1.2?

python - 如果已创建 dask.distributed 客户端,则 xarray.open_mfdataset() 不起作用

arrays - 在 Bash 中从文本文件创建数组

arrays - scala中非元组的多重赋值

python - 从 NETCDF4 格式的网格气象数据集创建时间序列

python - 将 numpy 数组作为变量添加到 Xarray 数据集