如何在进行操作后从NumPy数组中“去除”掩码?

5

我有一个 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

但是,当我对掩码数组应用给定操作后,如何将掩码值改回原始值并“删除”掩码呢?
我需要这样做的原因是,我基于一组条件生成布尔数组,并且需要修改满足条件的数组元素。
对于1D数组,我可以使用布尔索引来完成此操作,但是对于2D数组,我需要保留其原始形状,即不能返回仅包含满足条件的值的1D数组。

2
如果您想使用掩码变量而不是原始数组变量,可以设置 masked.mask = False - Marcin
2个回答

9

被接受的答案并没有回答这个问题。将掩码分配给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

1
@G.M. 很棒的答案。真的帮助我走出了困境。 - gansub

8

你已经拥有它了:它被称为array

这是因为虽然masked确保你只增加矩阵中的某些值,但数据实际上从未被复制。因此,一旦你的代码执行完毕,array的元素会被递增,而其余部分则保持不变。


太好了!出于某种原因,我以为掩码数组只包括原始数组的副本和一个掩码。感谢您的及时回复! - pbreach
6
值得一提的是,np.ma.arraynp.ma.masked_array构造函数有一个可选的copy关键字参数(默认为False)。如果copy=True,则会创建一个副本。如果copy=False,则尽可能引用原始数组。 - Joe Kington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接