0

让我们在 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

np.nan用etc代替1.0--- 没有警告。

为什么np.nan不能被屏蔽再比较?

4

2 回答 2

1

MA 有几种实现方法的策略。

1) 在 上评估方法,并用y.data制作新方法。它可能会抑制任何运行时警告。may.mask

2)y.filled() 使用默认填充值评估 # 上的方法

3) 在y.filled(1) # 或其他一些无害的值上评估方法

4)评估方法y.compressed()

5)评估方法y.data[~y.mask]

乘法,例如使用filled(1),加法使用filled(0)

看起来比较是用1)完成的。

我没有ma详细研究过代码,但我认为它不会 5).

如果您ma只是为了避免运行时警告而使用,则有一些替代方法。

  • 有一组np.nan...函数nan在计算之前过滤掉

  • 有一些方法可以抑制运行时警告

  • ufuncs有一个where参数可以用来跳过一些元素。将其与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类,并使用 1) - 评估datawith

np.seterr(divide='ignore', invalid='ignore')

结果掩码是参数掩码的逻辑组合。

https://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html#operations-on-masked-arrays

于 2020-02-21T17:46:17.423 回答
0

Making the issue more simple, let's assume:

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)

and the output is:

[-- 0.0 2.0] (3,)
[2.0] (1,) (3,)

with the RuntimeWarning: /.../anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in greater.

Changing:

...
m = (y != 2.0)
...

We get:

[-- 0.0 2.0] (3,)
[-- 0.0] (2,) (3,)

so we have a masked element and the result without any RuntimeWarning.

Changing now:

...
m = y.mask.copy() ; y[np.isnan(y)] = 9.0 ; y.mask = m ; m = (y > 1.0)
...

We get (without RuntimeWorning):

[-- 0.0 2.0] (3,)
[-- 2.0] (2,) (3,)

This work-around is however strange (by setting arbitrary value in the place of np.nan and mask saving). Comparing something with masked should be always masked, shouldn't it?

于 2020-02-21T15:42:35.447 回答