想要屏蔽数据时将数组设置为零,不屏蔽数据时将数组设置为零

问题描述 投票:0回答:1

我有被屏蔽的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且不为零的数组。如果您有关于如何提高代码效率的建议,我也将非常高兴。谢谢,

python netcdf masked-array
1个回答
0
投票

保持简单!不需要所有手动循环,这会使大型数据集的处理速度非常慢。一个带有其他数据的小示例(其中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"?
© www.soinside.com 2019 - 2024. All rights reserved.