numpy阵列与nan到a-s的不等式比较

2024-05-11 10:52:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将低于阈值的数组成员设置为nan。这是QA/QC过程的一部分,传入的数据可能已经有了nan插槽。

因此作为一个例子,我的阈值可能是-1000,因此我想在下面的数组中将-3000设置为nan

x = np.array([np.nan,1.,2.,-3000.,np.nan,5.])

以下内容:

x[x < -1000.] = np.nan

生成正确的行为,但也生成运行时警告,但禁用警告的开销

warnings.filterwarnings("ignore")
...
warnints.resetwarnings()

有点重,有点不安全。

尝试按以下方式使用花哨的索引两次不会产生任何效果:

nonan = np.where(~np.isnan(x))[0]
x[nonan][x[nonan] < -1000.] = np.nan

我认为这是因为一个副本是由于整数索引或使用索引两次。

有没有人有相对简单的解决办法?在这个过程中使用屏蔽数组是可以的,但是最终的产品必须是一个ndarray,我不能引入新的依赖项。谢谢。


Tags: 数据警告过程np成员阈值数组nan
3条回答

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

np.less()有一个where参数,用于控制将应用操作的位置。所以你可以:

x[np.less(x, -1000., where=~np.isnan(x))] = np.nan

一个选项是使用^{}禁用相关警告:

with numpy.errstate(invalid='ignore'):
    ...

要全局关闭相关警告,请使用^{}

相关问题 更多 >