Python numpy掩码数组初始化

Python numpy掩码数组初始化,python,arrays,numpy,initialization,Python,Arrays,Numpy,Initialization,在我的工作中,我一直使用屏蔽数组,但我遇到的一个问题是,屏蔽数组的初始化有点笨拙。具体地说,ma.zeros()和ma.empty()返回的掩码数组具有与数组维度不匹配的掩码。我希望这样做的原因是,如果我没有指定给数组中的特定元素,它在默认情况下是被屏蔽的 In [4]: A=ma.zeros((3,)) ... masked_array(data = [ 0. 0. 0.], mask = False, fill_value = 1e+20) 我可

在我的工作中,我一直使用屏蔽数组,但我遇到的一个问题是,屏蔽数组的初始化有点笨拙。具体地说,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
的bool
ndarray
,形状与
数据相同)


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

a[:] = np.ma.masked

不幸的是,您的旁注#对于具有多个维度的数组,建议有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=ma.zero((2,2))
之后立即执行
a[0]=ma.nomask
无效。

嗨,皮埃尔,谢谢你的回复。在我的应用程序中,我总是想要一个掩码,这样,如果我没有最终指定给索引,它在默认情况下仍然是被屏蔽的(我编辑了我的问题以更好地反映这一点)。你的“旁注”似乎正是我一直在寻找的东西!我不确定这里到底发生了什么,但答案可能在于“基本”索引和“高级”索引之间的区别:1)如果您指定一个[0,0]=ma.masked,您会发现它按照您的预期工作。2) 如果您以您已经完成的方式指定了一个值(例如a[0][0]=1.),则该值的行为与预期相同。我不知道为什么分配一个特殊值和一个浮点值的行为会有所不同。