我想设置一个数组,低于阈值,以楠的成员。这是一个QA / QC过程的一部分,并且所述输入数据可能已经具有为NaN时隙。
因此,作为一个例子我的门槛可能是-1000,因此我想设置-3000至楠以下数组
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,我不能引进新的依赖。谢谢。
为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
一种方式是通过numpy.errstate
禁用相关的警告:
with numpy.errstate(invalid='ignore'):
...
在全球范围内关闭了相关的警告,使用numpy.seterr
。
np.less()具有控制所述操作将被施加的where
参数。所以,你可以这样做:
x[np.less(x, -1000., where=~np.isnan(x))] = np.nan
我个人忽略使用已经给出了答案np.errstate上下文管理器的警告,因为代码的清晰度是值得的额外时间,但这里是一个另类。
# given
x = np.array([np.nan, 1., 2., -3000., np.nan, 5.])
# apply NaNs as desired
mask = np.zeros(x.shape, dtype=bool)
np.less(x, -1000, out=mask, where=~np.isnan(x))
x[mask] = np.nan
# expected output and comparison
y = np.array([np.nan, 1., 2., np.nan, np.nan, 5.])
assert np.allclose(x, y, rtol=0., atol=1e-14, equal_nan=True)
该numpy的less
ufunc采用可选参数where
,只计算它在那里真实的,不像评估这两个选项,然后挑选一个相关的np.where
功能。然后,设置所需的输出时,它不是通过使用out
说法属实。
有点晚,但这是我会怎么做:
x = np.array([np.nan,1.,2.,-3000.,np.nan,5.])
igood=np.where(~np.isnan(x))[0]
x[igood[x[igood]<-1000.]]=np.nan