【问题标题】:Want to make an array with zeros when data is masked and ones when data is not masked想要在数据被屏蔽时创建一个零数组,在数据未被屏蔽时创建一个数组
【发布时间】:2020-02-23 13:50:31
【问题描述】:

我有被屏蔽的 netcdf 数据。数据在(时间,纬度,经度)。我想创建一个与原始数据大小相同的数组,但当数据被屏蔽时为零,而数据未被屏蔽时为零。到目前为止,我已尝试实现此功能:

def find_unmasked_values(data):
   empty = np.ones((len(data),len(data[0]),len(data[0,0])))
   for k in range(0,len(data[0,0]),1): # third coordinate
       for j in range(0,len(data[0]),1): # second coordinate
           for i in range(0,len(data),1): # first coordinate
               if ma.is_mask(data[i,j,k]) is True:
                   empty[i,j,k] = 0
   return(empty)

但这只会返回一个包含 1 且没有 0 的数组,即使数据中有被屏蔽的值。如果您对如何提高代码效率有任何建议,我也会很高兴。 谢谢,

【问题讨论】:

    标签: python netcdf masked-array


    【解决方案1】:

    保持简单!不需要所有手动循环,这将使您的方法对于大型数据集非常慢。一个带有其他数据的小例子(其中thl 是一个掩码变量):

    import netCDF4 as nc4
    
    nc  = nc4.Dataset('bomex_qlcore_0000000.nc')
    var = nc['default']['thl'][:]
    
    mask_1 = var.mask  # masked=True, not masked=False
    mask_2 = ~var.mask # masked=False, not masked=True
    
    # What you need:
    int_mask = mask_2.astype(int) # masked=0, not masked=1
    

    p.s.:其他一些说明:

    • 除了len(array)len(array[0]) 等,您还可以使用array.shape 直接获取数组的形状,它会返回一个包含数组维度的元组。
    • 如果您想创建一个与另一个数组具有相同维度的新数组,只需使用empty = np.ones_like(data)(或np.zeros_like(),如果您想要一个零数组)。
    • ma.is_mask() 已经返回一个布尔值;无需将其与 True 进行比较。
    • 不要将is== 混淆:Is there a difference between "==" and "is"?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      相关资源
      最近更新 更多