0

我有简单的数组,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 个通过。我假设因为 amasked_array被认为是ndarray

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

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

4

3 回答 3

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()
于 2019-11-14T16:59:19.377 回答
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

于 2019-11-14T16:48:48.803 回答
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))
于 2019-11-14T16:48:53.937 回答