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