在jupyter中的"np.ma.array"问题中屏蔽了"np.nan"



让我们在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,不是吗?

相关内容

  • 没有找到相关文章

最新更新