与楠numpy的阵列的不等式相比于标量

问题描述 投票:14回答:5

我想设置一个数组,低于阈值,以楠的成员。这是一个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,我不能引进新的依赖。谢谢。

python numpy indexing nan inequality
5个回答
9
投票

为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

12
投票

一种方式是通过numpy.errstate禁用相关的警告:

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

在全球范围内关闭了相关的警告,使用numpy.seterr


2
投票

np.less()具有控制所述操作将被施加的where参数。所以,你可以这样做:

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

1
投票

我个人忽略使用已经给出了答案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说法属实。


1
投票

有点晚,但这是我会怎么做:

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
© www.soinside.com 2019 - 2024. All rights reserved.