我试图将低于阈值的数组成员设置为nan.这是QA/QC过程的一部分,并且输入数据可能已经具有nan的时隙.
因此,作为示例,我的阈值可能是-1000,因此我想在以下数组中将-3000设置为nan
x = np.array([np.nan,1.,2.,-3000.,np.nan,5.])
以下内容:
x[x < -1000.] = np.nan
产生正确的行为,但也是RuntimeWarning,但是禁用警告的开销
warnings.filterwarnings("ignore") ... warnints.resetwarnings()
有点沉重,可能有点不安全.
尝试使用花式索引进行两次索引,如下所示不会产生任何影响:
nonan = np.where(~np.isnan(x))[0] x[nonan][x[nonan] < -1000.] = np.nan
我认为这是因为整数索引或使用索引两次进行复制.
有人有一个相对简单的解决方案吗?在这个过程中使用一个蒙面数组会很好,但最终的产品必须是一个ndarray,我不能引入新的依赖.谢谢.
一种选择是禁用相关警告numpy.errstate
:
with numpy.errstate(invalid='ignore'): ...
要全局关闭相关警告,请使用numpy.seterr
.
!=
NaN与非NaN值的任何比较(除了)将始终返回False:
>>> x < -1000 array([False, False, False, True, False, False], dtype=bool)
所以你可以简单地忽略你的数组中已经存在NaN的事实:
>>> x[x < -1000] = np.nan >>> x array([ nan, 1., 2., nan, nan, 5.])
编辑我在上面运行时没有看到任何警告,但是如果你真的需要远离NaN,你可以做类似的事情:
mask = ~np.isnan(x) mask[mask] &= x[mask] < -1000 x[mask] = np.nan