Numpy在NaN存在的情况下创建逻辑数组

时间:2016-08-08 18:11:24

标签: numpy

我有一个数组SELECT * FROM rows WHERE id BETWEEN (SELECT @id := id FROM rows WHERE unique_id = "iii") - 4 AND @id + 4 ,我想从中提取逻辑掩码。 x包含x个值,并且掩码操作会引发警告,这是我要避免的。

这是我的代码:

nan

生成的蒙版是正确的(import numpy as np x = np.array([[0, 1], [2.0, np.nan]]) mask = np.isfinite(x) & (x > 0) ),但会发出警告:

array([[False,  True], [ True, False]], dtype=bool)

如何以避免与NaNs比较的方式构建蒙版?我不是要压制警告(我知道怎么办)。

2 个答案:

答案 0 :(得分:2)

我们可以分两步完成 - 创建有限的掩码然后使用相同的掩码自我索引,并选择x之外剩余有限元的有效掩码进行测试并设置为该面具中剩余的元素。所以,我们会有这样的实现 -

In [35]: x
Out[35]: 
array([[  0.,   1.],
       [  2.,  nan]])

In [36]: mask = np.isfinite(x)

In [37]: mask[mask] = x[mask]>0

In [38]: mask
Out[38]: 
array([[False,  True],
       [ True, False]], dtype=bool)

答案 1 :(得分:1)

看起来蒙版数组适用于这种情况:

In [214]: x = np.array([[0, 1], [2.0, np.nan]])
In [215]: xm = np.ma.masked_invalid(x)
In [216]: xm
Out[216]: 
masked_array(data =
 [[0.0 1.0]
 [2.0 --]],
             mask =
 [[False False]
 [False  True]],
       fill_value = 1e+20)

In [217]: xm>0
Out[217]: 
masked_array(data =
 [[False True]
 [True --]],
             mask =
 [[False False]
 [False  True]],
       fill_value = 1e+20)
In [218]: _.data
Out[218]: 
array([[False,  True],
       [ True, False]], dtype=bool)

但除了传播掩蔽之外,我不知道它是如何处理像这样的元素操作。通常的fillcompressed步骤似乎不相关。