我有一个数组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比较的方式构建蒙版?我不是要压制警告(我知道怎么办)。
答案 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)
但除了传播掩蔽之外,我不知道它是如何处理像这样的元素操作。通常的fill
和compressed
步骤似乎不相关。