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

时间:2015-01-06 03:15:33

标签: python arrays numpy

我有一个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数组我需要保留其原始形状,即。不返回只有满足条件的值的一维数组。

2 个答案:

答案 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