让我们在Anaconda Jupyter中运行Python3 NumPy代码:
y = np.ma.array(np.matrix([[np.nan, 2.0]]), mask=[0, 1])
m = (y < 0.01)
我们有警告:/.../anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in less
。
用1.0
等代替np.nan
——无警告。
为什么np.nan
不能被屏蔽然后进行比较?
MA有几种实现方法的策略。
1( 在y.data
上对该方法进行了评价,并用y.mask
制作了新的ma
。它可能会抑制任何运行时警告。
2( 使用默认填充值在y.filled()
#上评估该方法
3( 对y.filled(1)
#或其它一些无害值的方法进行评价
4( 对y.compressed()
方法的评价
5( 对y.data[~y.mask]
方法的评价
乘法,例如使用filled(1)
,加法使用filled(0)
。
比较似乎是用1(完成的。
我还没有详细研究过ma
代码,但我认为它不会。
如果您使用ma
只是为了避免运行时警告,那么还有一些替代方案。
-
有一组
np.nan...
函数,在计算之前过滤掉nan
-
有几种方法可以压制运行时警告
-
CCD_ 18具有可用于跳过某些元素的CCD_ 19参数。将其与
out
参数一起使用,以定义跳过的参数。
===
查看np.ma.core.py
,我看到类似ma.less
的函数。
In [857]: y = np.ma.array([np.nan, 0.0, 2.0], mask=[1, 0, 0])
In [858]: y >1.0
/usr/local/bin/ipython3:1: RuntimeWarning: invalid value encountered in greater
#!/usr/bin/python3
Out[858]:
masked_array(data=[--, False, True],
mask=[ True, False, False],
fill_value=True)
In [859]: np.ma.greater(y,1.0)
Out[859]:
masked_array(data=[--, False, True],
mask=[ True, False, False],
fill_value=True)
查看代码,ma.less
等是一个MaskedBinaryOperation
类,并使用在data
上使用1(-eevaluate
np.seterr(divide='ignore', invalid='ignore')
结果掩码是参数掩码的逻辑组合。
https://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html#operations-在掩蔽阵列上
让问题变得更简单,让我们假设:
y = np.ma.array([np.nan, 0.0, 2.0], mask=[1, 0, 0])
m = (y > 1.0)
print(y, y.shape) ; print(y[m], y[m].shape, m.shape)
输出为:
[-- 0.0 2.0] (3,)
[2.0] (1,) (3,)
带有运行时间警告:/.../anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in greater
。
更改:
...
m = (y != 2.0)
...
我们得到:
[-- 0.0 2.0] (3,)
[-- 0.0] (2,) (3,)
所以我们有一个屏蔽的元素和没有任何RuntimeWarning的结果。
正在更改:
...
m = y.mask.copy() ; y[np.isnan(y)] = 9.0 ; y.mask = m ; m = (y > 1.0)
...
我们得到(没有RuntimeWorning(:
[-- 0.0 2.0] (3,)
[-- 2.0] (2,) (3,)
然而,这种变通方法很奇怪(通过在np.nan
和掩码保存的位置设置任意值(。与masked
相比,应该总是masked
,不是吗?