如何在执行操作后从 numpy 数组中 "remove" 屏蔽?

How to "remove" mask from numpy array after performing operations?

我有一个 2D numpy 数组,我需要根据条件屏蔽它,以便我可以对屏蔽数组应用操作,然后将屏蔽值恢复为原始值。

例如:

import numpy as np

array = np.random.random((3,3))
condition = np.random.randint(0, 2, (3,3))
masked = np.ma.array(array, mask=condition)

masked += 2.0

但是如何在对掩码数组应用给定操作后将掩码值更改回原始值和 "remove" 掩码?

之所以需要这样做是因为我要根据一组条件生成一个布尔数组,我需要修改数组中满足条件的元素。

我可以使用布尔索引对一维数组执行此操作,但对于二维数组我需要保留其原始形状,即。不是 return 只有满足条件的值的一维数组。

您已经拥有它:它叫做 array

这是因为虽然 masked 确保您只增加矩阵中的某些值,但实际上从未复制数据。因此,一旦您的代码执行,array 的元素在 condition 处递增,其余元素保持不变。

接受的答案没有回答问题。将掩码分配给 False 在实践中有效,但许多算法不支持掩码数组(例如 scipy.linalg.lstsq()),并且此方法无法摆脱它。所以你会遇到这样的错误:

ValueError: masked arrays are not supported

真正摆脱掩码的唯一方法是仅将变量分配给掩码数组的数据。

import numpy as np

array = np.random.random((3,3))
condition = np.random.randint(0, 2, (3,3))
masked = np.ma.array(array, mask=condition)

masked += 2.0

masked.mask = False
hasattr(masked, 'mask')
>> True 

使用 MaskedArray 数据属性将变量分配给数据:

masked = masked.data 
hasattr(masked, 'mask')
>> False