我有一个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数组我需要保留其原始形状,即。不返回只有满足条件的值的一维数组。
答案 0 :(得分:8)
你已经拥有它:它被称为array
!
这是因为虽然masked
确保您只增加矩阵中的某些值,但数据永远不会被实际复制。因此,一旦您的代码执行,array
的元素condition
递增,其余元素保持不变。
答案 1 :(得分:1)
接受的答案并没有回答这个问题。将掩码分配给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