确定numpy掩码数组是否包含任何非掩码值的最有效方法?

时间:2014-01-18 01:19:46

标签: python arrays numpy

我想在掩码数组上执行复杂的计算,只要它包含任何(或理想情况下,至少X)非掩码值。有没有办法在不迭代数组并检查每个值的情况下有效地做到这一点?

1 个答案:

答案 0 :(得分:6)

count()方法告诉您有多少非掩码元素:

In [6]: m = np.ma.masked_array([1, 2, 3, 4], mask=[False, False, True, False])

In [7]: m
Out[7]: 
masked_array(data = [1 2 -- 4],
             mask = [False False  True False],
       fill_value = 999999)

In [8]: m.count()
Out[8]: 3

如果你只想知道是否有任何非掩码元素,你可以使用all()属性的mask方法。 mask attrbute是一个布尔数组,在每个被屏蔽的元素上都为True。

这是m的掩码:

In [16]: m.mask
Out[16]: array([False, False,  True, False], dtype=bool)

m是否有任何非遮罩元素?

In [18]: not m.mask.all()
Out[18]: True

b的元素都被屏蔽了:

In [23]: b = np.ma.masked_array([1, 2, 3, 4], mask=[True, True, True, True])
In [24]: b
Out[24]: 
masked_array(data = [-- -- -- --],
             mask = [ True  True  True  True],
       fill_value = 999999)

b中的任何非遮罩元素?

In [26]: not b.mask.all()
Out[26]: False

你的问题是关于最有效的方法,所以让我们比较更大阵列的时间。

首先创建一个包含1000个元素的随机数组。

In [72]: x = np.random.randint(0,3,size=1000)

创建一个蒙版数组,其中x的零被屏蔽。

In [73]: mx = np.ma.masked_array(x, mask=x==0)

In [74]: mx.count()
Out[74]: 680

时间比较:

In [75]: %timeit mx.count()
100000 loops, best of 3: 10.4 us per loop

In [76]: %timeit not mx.mask.all()
100000 loops, best of 3: 3.37 us per loop

因此,对于此数组,not mx.mask.all()的速度比mx.count()快三倍。