我正在尝试将陆地/海洋掩码应用于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, :, :, :]))[:]
答案 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)