有效地检查数据是否被掩码数组和所有数据都被掩码True

时间:2019-11-14 16:28:07

标签: python numpy masked-array

我有一个简单的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通过,以便我可以对数据进行操作。理想情况下,它也很简单:)

3 个答案:

答案 0 :(得分:2)

这是一个简单的解决方案,通过首先确保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()

答案 1 :(得分:1)

证明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

答案 2 :(得分:0)

有两个问题:

  1. 对于所有数组,您有isinstance(data,np.ndarray)为True。
  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))