在Python

时间:2017-03-27 00:19:19

标签: python numpy netcdf python-xarray

我正在尝试将陆地/海洋掩码应用于netCDF文件中的某些数据。我的代码有效,但修改了磁盘上的文件。我希望能够在内存中执行此操作,但变量的形状类似于(240, 46, 400, 568),甚至只是运行np.zeros来尝试类似

的内容
with Dataset('parameters/masks.nc', 'r') as mask, Dataset('remapped/' + ifile, 'a') as to_mask:
    masked_data = np.zeros(to_mask['alk'].shape)
    if len(to_mask['alk'].shape) == 4:  # The dimensions are time,depth,lat,lon
        for i in range(0, to_mask[var].shape[0]):
            masked_data[i, :, :, :] = ma.masked_where(
                np.logical_not(np.array(mask['tmask'][0, :, :, :], dtype=bool)),
                np.array(to_mask[var][i, :, :, :]))[:]

给了我一个MemoryError。这对我来说似乎有点奇怪,因为我可以加载数据并使用它而没有内存问题。

我已经开始关注xarray,因为它似乎有一些我想用来处理数据的函数,比如简单的时间平均,但似乎没有一种直接的方法来应用掩码就像我想要的那样。

当前代码:

from netCDF4 import Dataset
import numpy as np

with Dataset('parameters/masks.nc', 'r') as mask, Dataset('remapped/' + ifile, 'a') as to_mask:
    for var in to_mask.variables:
        if len(to_mask[var].shape) == 4:  # The dimensions are time,depth,lat,lon
            for i in range(0, to_mask[var].shape[0]):
                to_mask[var][i, :, :, :] = ma.masked_where(
                    np.logical_not(np.array(mask['tmask'][0, :, :, :], dtype=bool)),
                    np.array(to_mask[var][i, :, :, :]))[:]

1 个答案:

答案 0 :(得分:1)

按照惯例,只需再敲打一个问题几个小时就可以了。我的工作代码(原谅更改变量名称ect)使用xarray,正如我所想的那样。

import xarray as xr

with xr.open_dataset(mask_file) as m_f, xr.open_dataset(input_file) as i_f:
    mask = m_f['tmask'][0, :, :, :].values
    data = i_f[var].where(mask)