我在工作中一直使用掩码数组,但是我遇到的一个问题是,掩码数组的初始化有点笨拙.具体来说,ma.zeros()和ma.empty()返回的蒙版数组的掩码与数组维数不匹配.我想要这样做的原因是,如果不分配给数组的特定元素,则默认情况下会将其屏蔽.
In [4]: A=ma.zeros((3,))
...
masked_array(data = [ 0. 0. 0.],
mask = False,
fill_value = 1e+20)
我可以随后分配掩码:
In [6]: A.mask=ones((3,))
...
masked_array(data = [-- -- --],
mask = [ True True True],
fill_value = 1e+20)
但是,为什么我必须使用两行来初始化和数组?另外,我可以忽略ma.zeros()功能,并在一行中指定掩码和数据:
In [8]: A=ma.masked_array(zeros((3,)),mask=ones((3,)))
...
masked_array(data = [-- -- --],
mask = [ True True True],
fill_value = 1e+20)
但是我认为这也很笨拙.我已经浏览了numpy.ma文档,但是找不到一种处理此问题的灵巧方法.我错过了明显的事情吗?
解决方法:
好吧,ma.zeros中的掩码实际上是一个特殊常量ma.nomask,它对应于np.bool_(False).只是一个占位符,告诉NumPy尚未设置蒙版.
使用nomask实际上可以显着提高np.ma:如果我们事先知道不存在被屏蔽的值,则无需跟踪被屏蔽的值在哪里.
最好的方法是不要在不需要时显式设置掩码,而在需要时(即,当您最终尝试获取负数的对数时)保留np.ma进行设置.
旁注1:将遮罩设置为与输入形状相同的False数组,请使用
np.ma.array(..., mask=False)
这更容易键入.请注意,这实际上是Python False,不是np.ma.nomask …类似地,使用mask = True强制屏蔽所有输入(即mask将是一个充满True的布尔ndarray,其形状与数据).
旁注2:
如果您需要在初始化后设置掩码,则不要对.mask使用赋值,而应将其赋给特殊值np.ma.masked,这是更安全的:
a[:] = np.ma.masked
标签:initialization,arrays,python,numpy
来源: https://codeday.me/bug/20191031/1977379.html