5

我在工作中一直使用屏蔽数组,但我遇到的一个问题是屏蔽数组的初始化有点笨拙。具体来说, 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文档,但我找不到处理这个问题的简洁方法。我错过了什么明显的东西吗?

4

2 回答 2

4

嗯,掩码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将是一个ndarray充满 的布尔值True,与 具有相同的形状data)。


旁注#2:如果您需要在初始化后设置掩码,则不应使用赋值,.mask而是分配给特殊值np.ma.masked,这样更安全:

a[:] = np.ma.masked
于 2012-11-13T01:33:44.223 回答
0

不幸的是,您的旁注#2 建议中断了具有多于一维的数组:

a = ma.zeros( (2,2) )
a[0][0] = ma.masked
a
masked_array(data =
 [[ 0.  0.]
 [ 0.  0.]],
         mask =
 False,
   fill_value = 1e+20)

像OP一样,我还没有找到解决这个问题的好方法。屏蔽一整行将正确初始化掩码:

 a[0] = ma.masked
 a
 masked_array(data =
 [[-- --]
 [0.0 0.0]],
             mask =
 [[ True  True]
 [False False]],
       fill_value = 1e+20)

但如果这不是您想要做的,那么您必须a[0] = ma.nomask撤消它。a[0] = ma.nomask之后立即执行a = ma.zeros( (2,2) )没有效果。

于 2015-06-09T15:18:22.633 回答