在 Python 循环中迭代屏蔽 3D 数组的奇怪问题

Weird issue masking 3D arrays iteratively in Python loop

我有一个 3D 阵列,包含 10 个 2D 世界地图。我创建了一个海洋掩码,我正在尝试创建第二个阵列,与我的第一个 3D 阵列相同,但海洋每年都被掩蔽。我认为这应该有效:

SIF_year = np.ndarray((SIF_year0.shape))
for i in range(0,SIF_year0.shape[0]): 
    SIF_year[i,:,:] = np.ma.array(SIF_year0[i,:,:], mask = np.logical_not(mask_global_land))

其中 SIF_year0 是初始 3D 数组,SIF_year 是已屏蔽的版本。然而,SIF_year 看起来就像 SIF_year0。有趣的是,如果我这样做:

SIF_year = np.ndarray((SIF_year0.shape))
    for i in range(0,SIF_year0.shape[0]): 
        SIF_test = np.ma.array(SIF_year0[i,:,:], mask = np.logical_not(mask_global_land))

然后SIF_test就是我需要的蒙面二维数组。我试过将掩码数组保存到 SIF_test,然后将其重新保存到 SIF_year[i,:,:],但是 SIF_year 看起来又像 SIF_year0

一定是我遗漏了一些明显的错误...

我想我已经解决了这个问题,方法是在循环中添加一个额外的步骤,使用 ma.filled (https://docs.scipy.org/doc/numpy/reference/routines.ma.html) 将 masked 值替换为 np.NaN

SIF_year = np.ndarray((SIF_year0.shape))
for i in range(0,SIF_year0.shape[0]): 
    SIF_test = np.ma.array(SIF_year0[i,:,:], mask =  np.logical_not(mask_global_land))
    SIF_year[i,:,:] = np.ma.filled(SIF_test, np.nan)