numpy数组与nan到标量的不等式比较

Eli*_*i S 16 python indexing inequality numpy nan

我试图将低于阈值的数组成员设置为nan.这是QA/QC过程的一部分,并且输入数据可能已经具有nan的时隙.

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

x = np.array([np.nan,1.,2.,-3000.,np.nan,5.])
Run Code Online (Sandbox Code Playgroud)

以下内容:

x[x < -1000.] = np.nan
Run Code Online (Sandbox Code Playgroud)

产生正确的行为,但也是RuntimeWarning,但是禁用警告的开销

warnings.filterwarnings("ignore")
...
warnints.resetwarnings()
Run Code Online (Sandbox Code Playgroud)

有点沉重,可能有点不安全.

尝试使用花式索引进行两次索引,如下所示不会产生任何影响:

nonan = np.where(~np.isnan(x))[0]
x[nonan][x[nonan] < -1000.] = np.nan
Run Code Online (Sandbox Code Playgroud)

我认为这是因为整数索引或使用索引两次进行复制.

有人有一个相对简单的解决方案吗?在这个过程中使用一个蒙面数组会很好,但最终的产品必须是一个ndarray,我不能引入新的依赖.谢谢.

use*_*ica 13

一种选择是禁用相关警告numpy.errstate:

with numpy.errstate(invalid='ignore'):
    ...
Run Code Online (Sandbox Code Playgroud)

要全局关闭相关警告,请使用numpy.seterr.

  • 您可以使用[errstate](http://docs.scipy.org/doc/numpy/reference/generated/numpy.errstate.html)作为首选项. (2认同)

Jai*_*ime 11

!=NaN与非NaN值的任何比较(除了)将始终返回False:

>>> x < -1000
array([False, False, False,  True, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

所以你可以简单地忽略你的数组中已经存在NaN的事实:

>>> x[x < -1000] = np.nan
>>> x
array([ nan,   1.,   2.,  nan,  nan,   5.])
Run Code Online (Sandbox Code Playgroud)

编辑我在上面运行时没有看到任何警告,但是如果你真的需要远离NaN,你可以做类似的事情:

mask = ~np.isnan(x)
mask[mask] &= x[mask] < -1000
x[mask] = np.nan
Run Code Online (Sandbox Code Playgroud)

  • 我同意这种逻辑,很高兴您指出这不是他通常所说的“南不等于南”的问题。我尝试此操作时遇到的问题是它会生成运行时警告。一种选择是导入警告并捕获警告,但这是很多输入和开销。我希望有一个经济的选择。 (2认同)

小智 8

np.less()有一个where参数来控制操作的应用位置。所以你可以这样做:

x[np.less(x, -1000., where=~np.isnan(x))] = np.nan
Run Code Online (Sandbox Code Playgroud)