我有被屏蔽的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且不为零的数组。如果您有关于如何提高代码效率的建议,我也将非常高兴。谢谢,
保持简单!不需要所有手动循环,这会使大型数据集的处理速度非常慢。一个带有其他数据的小示例(其中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"?