Red*_*nda 8 python numpy masked-array
我一直在阅读掩码数组文档,但我很困惑 - MaskedArray 与仅维护值数组和布尔掩码有什么不同?有人能给我一个例子,其中 MaskedArrays 更方便,或者性能更高吗?
更新 6/5
为了更具体地说明我的问题,这里是一个如何使用 MaskedArray 的经典示例:
>>>data = np.arange(12).reshape(3, 4)
>>>mask = np.array([[0., 0., 1., 0.],
[0., 0., 0., 1.],
[0., 1., 0., 0.]])
>>>masked = np.ma.array(data, mask=mask)
>>>masked
masked_array(
data=[[0, 1, --, 3],
[4, 5, 6, --],
[8, --, 10, 11]],
mask=[[False, False, True, False],
[False, False, False, True],
[False, True, False, False]],
fill_value=999999)
>>>masked.sum(axis=0)
masked_array(data=[12, 6, 16, 14], mask=[False, False, False, False], fill_value=999999)
Run Code Online (Sandbox Code Playgroud)
我可以很容易地以这种方式做同样的事情:
>>>data = np.arange(12).reshape(3, 4).astype(float)
>>>mask = np.array([[0., 0., 1., 0.],
[0., 0., 0., 1.],
[0., 1., 0., 0.]]).astype(bool)
>>>masked = data.copy() # this keeps the original data reuseable, as would
# the MaskedArray. If we only need to perform one
# operation then we could avoid the copy
>>>masked[mask] = np.nan
>>>np.nansum(masked, axis=0)
array([12., 6., 16., 14.])
Run Code Online (Sandbox Code Playgroud)
我想 MaskedArray 版本看起来更好一些,如果您需要可重用的数组,则避免复制。从标准 ndarray 转换为 MaskedArray 时,它是否使用了同样多的内存?在将蒙版应用于数据时,它是否避免了引擎盖下的副本?还有其他优势吗?
官方回答在这里报道:
理论上,IEEE nan 是专门为解决缺失值问题而设计的,但实际情况是不同平台的行为不同,这让生活变得更加困难。在某些平台上,nan 的存在会使计算速度减慢 10-100 倍。对于整数数据,不存在 nan 值。
事实上,与类似的 nan 数组相比,掩码数组可能非常慢:
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)
Run Code Online (Sandbox Code Playgroud)
在多年的编程中,我发现它们在以下场合很有用:
np.nan用于缺失值,但我也用较差的 SNR 掩盖了该值,因此我可以识别两者。通常,您可以将掩码数组视为更紧凑的表示。最好的方法是逐案测试更易于理解和有效的解决方案。
| 归档时间: |
|
| 查看次数: |
3536 次 |
| 最近记录: |