我有一个简单的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通过,以便我可以对数据进行操作。理想情况下,它也很简单:)
答案 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)
有两个问题:
isinstance(data,np.ndarray)
为True。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))