如何在执行操作后从numpy数组中"删除"掩码?

pbr*_*ach 4 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
Run Code Online (Sandbox Code Playgroud)

但是,如何将屏蔽值更改回原始值并在将给定操作应用于屏蔽数组后"移除"屏蔽?

我需要这样做的原因是我基于一组条件生成一个布尔数组,我需要修改满足条件的数组元素.

我可以使用布尔索引来实现1D数组,但是对于2D数组我需要保留其原始形状,即.不返回仅具有满足条件的值的1D数组.

G M*_*G M 9

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

ValueError: masked arrays are not supported
Run Code Online (Sandbox Code Playgroud)

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

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 
Run Code Online (Sandbox Code Playgroud)

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

masked = masked.data 
hasattr(masked, 'mask')
>> False
Run Code Online (Sandbox Code Playgroud)


Joh*_*nck 8

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

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

  • @ user2593236 - 对于它的价值,`np.ma.array`或`np.ma.masked_array`构造函数采用可选的`copy` kwarg(默认为'False`).如果`copy = True`,则复制.如果`copy = False`,则引用原始数组(如果可能). (6认同)