Python numpy掩码数组初始化
在我的工作中,我一直使用屏蔽数组,但我遇到的一个问题是,屏蔽数组的初始化有点笨拙。具体地说,ma.zeros()和ma.empty()返回的掩码数组具有与数组维度不匹配的掩码。我希望这样做的原因是,如果我没有指定给数组中的特定元素,它在默认情况下是被屏蔽的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) 我可
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)
那更容易打字。请注意,它实际上是PythonFalse
,而不是np.ma.nomask
。。。同样,使用mask=True
强制屏蔽所有输入(即,mask
将是一个充满True
的boolndarray
,形状与数据相同)
旁注#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.),则该值的行为与预期相同。我不知道为什么分配一个特殊值和一个浮点值的行为会有所不同。