有效检查数据是否被屏蔽数组并且所有数据都被屏蔽 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
有两个问题:
- 对于所有数组,您的
isinstance(data,np.ndarray)
为真。
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()
我有简单的数组 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
有两个问题:
- 对于所有数组,您的
isinstance(data,np.ndarray)
为真。 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()