我有一个被屏蔽的numpy数组。在对每个元素进行处理时,我需要首先检查特定元素是否被屏蔽,如果被屏蔽,则需要跳过这些元素。
我试过这样做:
from netCDF4 import Dataset
data=Dataset('test.nc')
dim_size=len(data.dimensions[nc_dims[0]])
model_dry_tropo_corr=data.variables['model_dry_tropo_corr'][:]
solid_earth_tide=data.variables['solid_earth_tide'][:]
for i in range(0,dim_size)
try :
model_dry_tropo_corr[i].mask=True
continue
except :
Pass
try:
solid_earth_tide[i].mask=True
continue
except:
Pass
correction=model_dry_tropo_corr[i]/2+solid_earth_tide[i]有没有其他有效的方法可以做到这一点,请告诉我。我们非常感谢您的建议或意见。
发布于 2016-06-16 13:07:01
而不是循环,您可以使用
correction = model_dry_tropo_corr/2 + solid_earth_tide这将创建一个新的掩码数组,其中将包含您的答案和掩码。然后,您可以访问新数组中未掩码的值。
发布于 2016-06-17 04:11:19
我对这段代码感到困惑。
try :
model_dry_tropo_corr[i].mask=True
continue
except :
Pass我没有安装netCDF4,但从文档中可以看出,您的变量看起来会像这样,甚至可能是numpy.ma掩码数组。
如果您打印此变量的全部或部分内容,并具有诸如形状和dtype之类的属性,这将很有帮助。
我可以用下面这样的表达式创建一个掩码数组:
In [746]: M=np.ma.masked_where(np.arange(10)%3==0,np.arange(10))
In [747]: M
Out[747]:
masked_array(data = [-- 1 2 -- 4 5 -- 7 8 --],
mask = [ True False False True False False True False False True],
fill_value = 999999)我可以用以下命令测试给定元素的掩码是否为True/False:
In [748]: M.mask[2]
Out[748]: False
In [749]: M.mask[3]
Out[749]: True但如果我先建立索引,
In [754]: M[2]
Out[754]: 2
In [755]: M[3]
Out[755]: masked
In [756]: M[2].mask=True
...
AttributeError: 'numpy.int32' object has no attribute 'mask'
In [757]: M[3].mask=True因此,您的try/except将跳过掩码设置为True的元素。
但我认为这样做是很明显的:
if model_dry_tropo_corr.mask[i]:
continue但这仍然是迭代的。
但正如@user3404344所示,您可以对变量执行数学运算。掩蔽将会延续下去。但是,如果屏蔽值“不好”并在计算中导致错误,这可能是一个问题。
如果我定义了另一个掩码数组
In [764]: N=np.ma.masked_where(np.arange(10)%4==0,np.arange(10))
In [765]: N+M
Out[765]:
masked_array(data = [-- 2 4 -- -- 10 -- 14 -- --],
mask = [ True False False True True False True False True True],
fill_value = 999999)您可以看到在M或N中被屏蔽的元素在结果中是如何被屏蔽的
我可以使用compressed方法只给出有效的元素
In [766]: (N+M).compressed()
Out[766]: array([ 2, 4, 10, 14])在对掩码数组进行数学运算时,填充也很方便:
In [779]: N.filled(0)+M.filled(0)
Out[779]: array([ 0, 2, 4, 3, 4, 10, 6, 14, 8, 9])我可以使用filled中和问题计算,同时仍然屏蔽这些值
In [785]: z=np.ma.masked_array(N.filled(0)+M.filled(0),mask=N.mask|M.mask)
In [786]: z
Out[786]:
masked_array(data = [-- 2 4 -- -- 10 -- 14 -- --],
mask = [ True False False True True False True False True True],
fill_value = 999999)哦,我不需要担心屏蔽值会扰乱计算。被屏蔽的添加物正在为我做填充
In [787]: (N+M).data
Out[787]: array([ 0, 2, 4, 3, 4, 10, 6, 14, 8, 9])
In [788]: N.data+M.data # raw unmasked addition
Out[788]: array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
In [789]: z.data # same as the (N+M).data
Out[789]: array([ 0, 2, 4, 3, 4, 10, 6, 14, 8, 9])https://stackoverflow.com/questions/37849921
复制相似问题