有效检查数据是否被屏蔽数组并且所有数据都被屏蔽 True

effectively check if data are masked array and all data are masked True

我有简单的数组 numpy.ndarrays 而其他时候相同的变量可能是一个掩码数组。我想找出最有效的方法来检查数组中是否有数据并且所有数据都没有被屏蔽

我有以下说明:

data0 = np.ma.array([3,3,3,3,3], mask=[True, True, False, True, True])
data1 = np.ma.array([3,3,3,3,3], mask=[True, True, True, True, True])
data2 = np.array([3,3,3,3,3])
for dataNum, data in enumerate([data0, data1, data2]):
    if (isinstance(data, np.ma.masked_array) and not data.mask.all()) or (isinstance(data,np.ndarray)):
         print('if statement passed data{}'.format(dataNum))

但这允许所有 3 个都通过。我假设是因为 masked_array 被认为是 ndarray

if statement passed data0 if statement passed data1 if statement passed data2

我希望 data0 和 data2 通过,以便我可以对数据进行操作。理想情况下它也很简单 :)

原来 np.ma.isMaskedArray 解决了这个问题:

for dataNum, data in enumerate([data0, data1, data2]):
    if (np.ma.isMaskedArray(data) and not data.mask.all()) or not np.ma.isMaskedArray (data):
         print('if statement passed data{}'.format(dataNum))

if statement passed data0 if statement passed data2

有两个问题:

  1. 对于所有数组,您的 isinstance(data,np.ndarray) 为真。
  2. not data.mask.all() 在我看来是个打字错误。

这应该可以解决

for dataNum, data in enumerate([data0, data1, data2]):
    if ((isinstance(data, np.ma.masked_array) and  data.mask.all()) or 
        not (isinstance(data, np.ma.masked_array))):
         print('if statement passed data{}'.format(dataNum))

这是一个简单的解决方案,通过首先确保屏蔽 data 然后测试屏蔽(默认为 False)来避免多种情况:

not np.ma.array(data).mask.all()

因此对于您的具体示例:

for dataNum, data in enumerate([data0, data1, data2]):
    if not np.ma.array(data).mask.all():
        print('if statement passed data{}'.format(dataNum))

给你想要的结果。

编辑:为了减少开销,您可以使用 copy=False:

not np.ma.array(data, copy=False).mask.all()