当项集等于 fill_value 时自动屏蔽 np.ma 数组

Automatically mask np.ma array when item set equal to fill_value

我对 numpy.ma 掩码数组及其 fill_value 的行为感到有点惊讶。例如,当我创建一个数组时:

a = np.ma.array(np.zeros(4), mask=True, fill_value=-9999)

并更改其中一个值(例如a[2] = 1),掩码自动设置为False:

masked_array(data = [-- -- 1.0 --],
             mask = [ True  True False  True],
       fill_value = -9999.0)

但反过来,如果我将 a[2] 设置为等于此屏蔽数组的 fill_value,则该项目不会自动屏蔽:

masked_array(data = [-- -- -9999.0 --],
             mask = [ True  True False  True],
       fill_value = -9999.0) 

是否有一种自动方法可以让 np.ma 在元素的值设置为 fill_value 时自动将元素的掩码设置为 True

您可能需要查看屏蔽文档。屏蔽会影响值在计算中的显示和使用方式;但它不受值的直接影响。也就是说,一个值不会仅仅因为 if 等于填充值而被屏蔽。

但是在查看屏蔽方法时,我看到了一种被描述为:

masked_object(x, value[, copy, shrink]) Mask the array x where the data are exactly equal to value.

我们来试验一下?

In [185]: a = np.ma.array(np.zeros(4,int), mask=True, fill_value=-9999)
In [186]: a[2]=3
In [187]: a
Out[187]: 
masked_array(data = [-- -- 3 --],
             mask = [ True  True False  True],
       fill_value = -9999)
In [188]: a[2]=a.fill_value
In [189]: a
Out[189]: 
masked_array(data = [-- -- -9999 --],
             mask = [ True  True False  True],
       fill_value = -9999)
In [190]: np.ma.masked_object(a,a.fill_value)
Out[190]: 
masked_array(data = [-- -- -- --],
             mask = [ True  True  True  True],
       fill_value = -9999)

所以它返回了一个 a[2] 元素被屏蔽的副本 - 因为它等于 fill_value。我在这里切换到 'int' 以避免浮点相等问题。还有另一种处理浮点相等性的方法。

masked_values(x, value[, rtol, atol, copy, ...]) Mask using floating point equality.

如果a[2]=np.inf(对于浮点数a),则可以使用np.ma.masked_invalid

稍后在屏蔽文档中我发现:

The recommended way to mark one or several specific entries of a masked array as invalid is to assign the special value masked to them:

a[2]=np.ma.masked

你在 a[2]=2 看到的内容由

解释

To unmask one or several specific entries, we can just assign one or several new valid values to them:

掩码数组是一种从 mean 等计算中删除无效值的方法。 fill_value 不是无效值;填充用于替换其他操作中的屏蔽值。无效值可能 'floats',例如 np.nannp.inf,或任何其他适合您的问题(例如负数)。