为什么Numpy掩码数组有用?

时间:2019-05-04 23:26:36

标签: python numpy masked-array

我一直在阅读MaskedArray文档,但我很困惑-MaskedArray与仅维护值数组和布尔值掩码有何不同?有人可以给我一个例子,其中MaskedArrays更方便或更高效吗?

1 个答案:

答案 0 :(得分:1)

据报道here为官方答案:

  

理论上,IEEE nan是专门为解决该问题而设计的   缺少价值,但现实是不同平台的行为   不同的是,使生活更加困难。在某些平台上,   nan的存在会使计算速度降低10到100倍。对于整数数据,否   nan值存在。

实际上,与类似的nans数组相比,掩码数组可能会非常慢:

import numpy as np
g = np.random.random((5000,5000))
indx = np.random.randint(0,4999,(500,2))
g_nan = g.copy()
g_nan[indx] = np.nan
mask =  np.full((5000,5000),False,dtype=bool)
mask[indx] = True
g_mask = np.ma.array(g,mask=mask)

%timeit (g_mask + g_mask)**2
1.27 s ± 35.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
(g_nan + g_nan)**2
%timeit (g_nan + g_nan)**2
76.5 ms ± 715 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

什么时候有用?

在多年的编程中,我发现它们在以下场合很有用:

  • 当您想要保留屏蔽的值以供以后处理而无需复制数组时。
  • 您不想被nan运算的奇怪行为所欺骗(顺便you might be tricked by the behaviour of masked array)。
  • 当掩码必须包含多个数组时,如果掩码是数组的一部分,则可以避免代码和混乱。
  • 与nan值相比,您可以为掩码值分配不同的含义。例如,对于丢失的值,我使用np.nan,但同时也屏蔽了SNR较差的值,因此可以同时识别两者。

通常,您可以将掩码数组视为更紧凑的表示形式。最好的方法是逐案测试更全面,更有效的解决方案。