2012-11-13 50 views
3

我在工作中一直使用蒙面数组,但我遇到的一个问题是蒙面数组的初始化有点笨重。具体来说,ma.zeros()和ma.empty()会返回带有掩码的掩码数组,该掩码与数组维度不匹配。我想这样做的原因是,如果我不分配给我的数组的特定元素,它默认情况下会被屏蔽。Python numpy蒙面数组初始化

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文档,但我找不到处理这个问题的简单方法。我错过了明显的东西吗?

回答

3

那么,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将为bool ndarrayTrue,形状与data相同)。


边注2: 如果您需要设置初始化后的面具,你不应该使用赋值.mask,但分配到特殊值np.ma.masked,它的安全:

a[:] = np.ma.masked 
+0

嗨皮埃尔,谢谢你的回复。在我的应用程序中,我总是需要一个掩码,这样如果我不最终分配给一个索引,它将默认被屏蔽(我编辑了我的问题以更好地反映这一点)。 你的“旁注”似乎给了我一直在寻找的东西! –

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,我还没有找到一个整洁的WA在这附近。屏蔽一整排会正确初始化面膜:

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 = ma.zeros((2,2))之后立即执行a[0] = ma.nomask不起作用。

+0

我不确定这里发生了什么,但答案可能在于“基本”和“高级”索引之间的区别: http://docs.scipy.org/doc/numpy/reference/arrays.indexing .html 1)如果您指定[0,0] = ma.masked,您会发现它的工作方式与您的预期相同。 2)如果您按照已完成的方式(例如[0] [0] = 1)分配值,则其行为与预期相同。 我不知道为什么行为会分配一个特殊的值和一个浮动,虽然不同。 –